谁能给我解释一下为什么输出会是这个值
溢出问题 其实这类问题不要太纠结,很浪费时间……知道取值范围并且在编程的时候注意不要越界才是最重要的,至于为什么会有这个错误,其实并不是特别重要,因为有时候的错误是标准认为“未定义”的,即不同编译器会得到不同的值,追究起来意义不大……
所幸,这个错误还是可以被解释的~~~
首先 11111111111 这里有 11 个 1(字太小数了半天{:10_262:} )
因为计算机都是以二进制存储的嘛,对应的二进制数应该是:
因为我们的编译环境决定了整型(int)是占 4 个字节(并不是所有的编译环境都如此……),每个字节 8 个二进制数存储,所以 4 * 8 == 32。
问了来了,那么这里有 36 位,是取前面的 32 位还是取后面的 32 位好呢?
是取后面……
你想象一下你就往一个桶里倒水,流出来的永远是顶部的(溢出的是高位的字节)
好,取出来是:
10010110010001100001100111000111
那么第 1 位是 1,表示这是一个负数~~
哦,对了,咱这些数(带符号位的整数)在内存中都是以补码的形式存储的,第 1 位符号位。
如果符号位是 0,补码等于原码;如果符号位是 1,补码等于原码取反 +1。
OK,第 1 位符号位是 1,所以除了符号位外,其它位的原码取反加 1 的结果是:
1101001101110011110011000111001
来,放到计算器里看看十进制是多少?
好了,这就是你想要的答案~~
{:10_242:}
哦,对了,你可能要问补码是什么鬼?
请看下这篇文章 -> http://bbs.fishc.com/thread-67124-1-1.html
i是4个字节32位的数据,取值范围为-2147483648~2147483647。
你看好多1个数字。 代码农民 发表于 2017-1-9 22:21
i是4个字节32位的数据,取值范围为-2147483648~2147483647。
你看好多1个数字。
这我也知道,我想知道的是为什么会这样? 代码农民 发表于 2017-1-9 22:21
i是4个字节32位的数据,取值范围为-2147483648~2147483647。
你看好多1个数字。
我想知道的事题中的数字经过怎么过程输出了这个错误的值 本帖最后由 代码农民 于 2017-1-9 22:38 编辑
超凡天赐 发表于 2017-1-9 22:31
我想知道的事题中的数字经过怎么过程输出了这个错误的值
这个跟计算机原理有关系,好像数反转了。。具体我也忘了。。你可以找个计算机原理的书看下 11,111,111,111 等于16进位 2,9646,19C7
9646,19C7取%d = -1,773,790,777 fc1735 发表于 2017-1-9 22:35
11,111,111,111 等于16进位 2,9646,19C7
9646,19C7取%d = -1,773,790,777
9646,19C7取%d为什么 = -1,773,790,777
页:
[1]