今天在刷C语言题的过程中遇到了一下这个问题,觉得很有趣。和大家分享一下!
int i=65536;printf("%d\n",i);
我想大部分人都S认为这个程序执行完了后结果是65536,的确我在VS2015编译器下编译出来的结果也是65536.但是我在C语言深度剖析这本书里面却不是这个答案。我看到的确实“0”这个答案。原因是这样的。
我们众所周知计算机的内部整数以二进制补码表示。变量i占用两个字节(16位计算机),其表示范围为-32768—32767,无法正确的表示65536.但65536=32767+32767+2,计算机内部以二进制补码相加:
0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
+ 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
+ 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
最后结果为 00000000 00000000,对应的原码为0;
虽然在现在的电脑中32位是比较常见的,但是我想应届生招聘考试中有些变态的HR也会出点这样的问题,学会这个不仅是让我们更好的面试,更多的是养成一种对各种变量定义良好的习惯。
谢谢大家,希望可以提出意见。
原文:http://10745245.blog.51cto.com/10735245/1747630