今天在刷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也会出点这样的问题,学会这个不仅是让我们更好的面试,更多的是养成一种对各种变量定义良好的习惯。

   谢谢大家,希望可以提出意见。