【C语言Tips】之char型变量的扩充
背景:
K&R中文版34页下面,写到char被"扩充"成int以后,根据实现在前面补上0或者1(以从8位凑够32位)。
char a = 0xffffffff; printf("%d",a); printf("%d",sizeof(a));
分别显示 -1 和1.
诡异的地方来了:-1是int型,32位(0xffff ffff),而sizeof(a)显示他只有一个字节,也就是只能放下两个0xf。那剩下的6个f放在哪呢?
解释:
char a = 0xff; printf("%d",a); printf("%d",sizeof(a));
输出同样结果(-1,1)。
char a = 0x123456ff; printf("%d",a); printf("%d",sizeof(a));
输出同样结果(-1,1)。
说明:保存在char型变量a中的数值只有两个ff,前面的6个16进制位都被抛弃了(这就解释了为什么sizeof(a)是1)。至于为什么printf("%d",a);显示-1,是因为将 char型数据扩充到int型(8位到32位)时,前面需要补上0或者1的位数,至于具体是补0还是补1,跟实现有关。经测试,在我的电脑环境(Thinkpad X201i, 32位Win7, C-free)下,是补上char数据的最高位。经过测试,强制类型转换到int时,遵循同样的规则。
总结:
char a = 0xffffffff; //这一步中,只有最后两个ff存储到了char a中,前面六个被抛弃 printf("%d",a); //a现在其实只有ff,但因为要按int型输出,故前面的位全部补上了a的最高位1 printf("%d",sizeof(a)); //为什么是1就很好解释了:)