C语言程序类型转换原理及printf输出异常原因问询
解析C语言程序中的类型转换与输出问题
一、类型转换的工作原理
- 代码里的
char *c = (char*)&n;是强制类型转换:&n是指向unsigned int变量n的指针,类型为unsigned int*。通过(char*)转换后,编译器会把这个地址当作char*类型处理——直白点说,原本访问n时一次读取4个字节(32位系统下unsigned int的标准大小),现在通过c访问时,每次只读1个字节,实现了按字节查看n的内存布局。
二、用%d输出*c得到1的原因
- 当
n = 1时,在小端序系统中,多字节变量的低位字节会存在内存的低地址处:unsigned int类型的1用十六进制表示是0x00000001,所以内存低地址的第一个字节是0x01,后面三个字节都是0x00。 *c取的就是这个第一个字节的值0x01,用%d输出时,这个char类型的值会自动提升为int类型,不管char是有符号还是无符号,0x01转成int后都是1,所以最终输出1。- 要是在大端序系统里,第一个字节是
0x00,%d就会输出0,程序也会打印BIG ENDIAN。
三、用%s输出c无内容的原因
%s格式符要求对应的参数是以'\0'(ASCII值为0)结尾的字符串指针。- 小端序下,
c指向的第一个字节是0x01,这是个不可打印的控制字符,紧接着的就是0x00(也就是'\0'),printf一读到'\0'就停止输出,所以看起来没有内容。 - 哪怕是大端序,
c指向的第一个字节就是0x00,printf直接就停止输出,同样看不到内容。
四、额外说明:大小端判断逻辑
- 这段代码是判断系统大小端的经典写法:如果
*c非零(也就是1),说明低地址存的是变量的低位字节,属于小端序;如果是0,说明低地址存的是高位字节,属于大端序。
内容的提问来源于stack exchange,提问作者Siva Kumar E
相关产品推荐
相关产品推荐

