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

 

 

转载于:https://www.cnblogs.com/lushuai/archive/2012/10/13/2722062.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值