【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就很好解释了:)

 

 

posted on 2012-10-13 00:07  陆大侠  阅读(385)  评论(0编辑  收藏  举报

导航