超凡天赐 发表于 2017-1-9 22:15:40

谁能给我解释一下为什么输出会是这个值

溢出问题

小甲鱼 发表于 2017-1-9 23:46:40

其实这类问题不要太纠结,很浪费时间……

知道取值范围并且在编程的时候注意不要越界才是最重要的,至于为什么会有这个错误,其实并不是特别重要,因为有时候的错误是标准认为“未定义”的,即不同编译器会得到不同的值,追究起来意义不大……

所幸,这个错误还是可以被解释的~~~

首先 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



代码农民 发表于 2017-1-9 22:21:19

i是4个字节32位的数据,取值范围为-2147483648~2147483647。
你看好多1个数字。

超凡天赐 发表于 2017-1-9 22:28:11

代码农民 发表于 2017-1-9 22:21
i是4个字节32位的数据,取值范围为-2147483648~2147483647。
你看好多1个数字。

这我也知道,我想知道的是为什么会这样?

超凡天赐 发表于 2017-1-9 22:31:20

代码农民 发表于 2017-1-9 22:21
i是4个字节32位的数据,取值范围为-2147483648~2147483647。
你看好多1个数字。

我想知道的事题中的数字经过怎么过程输出了这个错误的值

代码农民 发表于 2017-1-9 22:34:54

本帖最后由 代码农民 于 2017-1-9 22:38 编辑

超凡天赐 发表于 2017-1-9 22:31
我想知道的事题中的数字经过怎么过程输出了这个错误的值

这个跟计算机原理有关系,好像数反转了。。具体我也忘了。。你可以找个计算机原理的书看下

fc1735 发表于 2017-1-9 22:35:38

11,111,111,111 等于16进位 2,9646,19C7
9646,19C7取%d = -1,773,790,777

超凡天赐 发表于 2017-1-9 22:42:10

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]
查看完整版本: 谁能给我解释一下为什么输出会是这个值