安静的转换有多安静?

#include <stdio.h>

int main()
{
int a = -1;
unsigned int b = 10;

if (a < b)
{
printf("It's OK!\n");
}
else
{
printf("%u %d\n", a - b, a - b);
}

return 0;
}

在C语言中要特别注意类型的隐式转换,如上代码,a为int类型,b为unsigned int,根据表达式的类型转换原则,a < b中,先将a转换为unsigned int类型。因为计算机存储数值采用二进制补码形式,架设a为一个4位的有符号整数,那么其二进制补码为1111,转换为unsigned int类型,a的十进制为15。同理此时a的值为4294967295(这和-1差得可是千山万水!),显然a > b。所以执行else,在printf("%u %d\n", a - b, a - b);中,a - b的计算过程的类型转换和上文提到的a < b是一致的,但是因为占位符%d和 %u的存在,输出的结果不一致,前者为4294967285,后者为我们想要的正确结果-11,为什么会这样呢?本来按照转换规则,a -b的计算结果应该为4294967285(unsigned int类型),但是%d让结果转换为int类型,那么就是-11,也就是我们得到的正确值。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值