为何将int赋值给char后printf未丢失数据?C语言技术问询
问题原因分析
这是两个关键C语言机制共同作用的结果:char的符号性和整型提升规则,具体拆解如下:
char的默认符号属性
绝大多数编译器里,char默认是有符号类型(signed char)。你定义的int x = 0xffffffff,在32位int环境下其实是-1的补码表示。把它赋值给1字节的char y时,只会保留低8位,也就是0xff——而对于signed char来说,0xff正好是-1的补码。函数调用时的整型提升
当你把char类型的y传给printf时,C语言会触发整型提升:所有小于int的整型类型(比如char、short)都会被提升为int。因为y是signed char且值为-1,提升时会进行符号扩展——把最高位的符号位(1)填充到int的所有高位,这样1字节的0xff就变成了4字节的0xffffffff(对应int类型的-1)。printf的
%x格式符行为%x是用来输出无符号十六进制整数的,它会把传入的int值0xffffffff当成无符号数处理,自然就输出了ffffffff。
解决办法
如果想得到预期的ff输出,有两种常用方式:
- 强制转换为unsigned char后再传入printf:
#include <stdio.h> int main(void) { int x = 0xffffffff; char y = x; printf("%x\n", (unsigned char)y); // 强制转换为无符号char,避免符号扩展 return 0; }
- 显式声明
y为unsigned char:
#include <stdio.h> int main(void) { int x = 0xffffffff; unsigned char y = x; // 直接用无符号char存储 printf("%x\n", y); return 0; }
这两种方式都会让整型提升时进行零扩展(高位补0),最终传入printf的是0x000000ff,用%x输出就会得到ff。
内容的提问来源于stack exchange,提问作者Greeshma
相关产品推荐
相关产品推荐

