其实这类问题不要太纠结,很浪费时间……
知道取值范围并且在编程的时候注意不要越界才是最重要的,至于为什么会有这个错误,其实并不是特别重要,因为有时候的错误是标准认为“未定义”的,即不同编译器会得到不同的值,追究起来意义不大……
所幸,这个错误还是可以被解释的~~~
首先 11111111111 这里有 11 个 1(字太小数了半天

)
因为计算机都是以二进制存储的嘛,对应的二进制数应该是:
因为我们的编译环境决定了整型(int)是占 4 个字节(并不是所有的编译环境都如此……),每个字节 8 个二进制数存储,所以 4 * 8 == 32。
问了来了,那么这里有 36 位,是取前面的 32 位还是取后面的 32 位好呢?
是取后面……
你想象一下你就往一个桶里倒水,流出来的永远是顶部的(溢出的是高位的字节)
好,取出来是:
10010110010001100001100111000111
那么第 1 位是 1,表示这是一个负数~~
哦,对了,咱这些数(带符号位的整数)在内存中都是以补码的形式存储的,第 1 位符号位。
如果符号位是 0,补码等于原码;如果符号位是 1,补码等于原码取反 +1。
OK,第 1 位符号位是 1,所以除了符号位外,其它位的原码取反加 1 的结果是:
1101001101110011110011000111001
来,放到计算器里看看十进制是多少?
好了,这就是你想要的答案~~
哦,对了,你可能要问补码是什么鬼?
请看下这篇文章 ->
http://bbs.fishc.com/thread-67124-1-1.html