You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 14:25:29