经常收到这样一个问题,以下代码的正确结果是什么
unsigned int a;
int b = -7;
a = 6;
(a + b > 6) ? puts(">6"):puts("<=b");
a = 8;
(a + b >8 ) ? puts(">8"):puts("<= 8");
正确答案是: >6 <=8
下面我们一起来分析下
隐含知识点:
- 数据类型的隐式转换,unsigned int和int进行运算时,会自动转换成unsigned int类型进行运算
- 数据的存储:源码、反码、补码
分析:
a = 6时
b源码 10000000 00000000 00000000 00000111
b反码 11111111 11111111 11111111 11111000
b补码 11111111 11111111 11111111 11111001
a源码、反码、补码 00000000 00000000 00000000 00000110
a+b= 11111111 11111111 11111111 11111111
结果用补码进行计算,计算完读取时以unsigned int来读,所以和补码一样是0xffff ffff
所以结果是 >6
a = 8时
b源码 10000000 00000000 00000000 00000111
b反码 11111111 11111111 11111111 11111000
b补码 11111111 11111111 11111111 11111001
a源码、反码、补码 00000000 00000000 00000000 00001000
a+b= 1 00000000 00000000 00000000 00000001
结果用补码进行计算,计算完读取时以unsigned int来读,所以和补码一样是0x0000 0001,最高位的1已经越界了,不在读取范围
所以结果是 <=8