鱼C论坛

 找回密码
 立即注册
查看: 1616|回复: 7

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

[复制链接]
发表于 2017-1-9 22:15:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
溢出问题
最佳答案
2017-1-9 23:46:40
其实这类问题不要太纠结,很浪费时间……

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

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

首先 11111111111 这里有 11 个 1(字太小数了半天

因为计算机都是以二进制存储的嘛,对应的二进制数应该是:

1.png

因为我们的编译环境决定了整型(int)是占 4 个字节(并不是所有的编译环境都如此……),每个字节 8 个二进制数存储,所以 4 * 8 == 32。

问了来了,那么这里有 36 位,是取前面的 32 位还是取后面的 32 位好呢?

是取后面……

你想象一下你就往一个桶里倒水,流出来的永远是顶部的(溢出的是高位的字节)

好,取出来是:

10010110010001100001100111000111

那么第 1 位是 1,表示这是一个负数~~

哦,对了,咱这些数(带符号位的整数)在内存中都是以补码的形式存储的,第 1 位符号位。

如果符号位是 0,补码等于原码;如果符号位是 1,补码等于原码取反 +1。

OK,第 1 位符号位是 1,所以除了符号位外,其它位的原码取反加 1 的结果是:

1101001101110011110011000111001

来,放到计算器里看看十进制是多少?

2.png

好了,这就是你想要的答案~~



哦,对了,你可能要问补码是什么鬼?

请看下这篇文章 -> http://bbs.fishc.com/thread-67124-1-1.html



屏幕快照 2017-01-09 下午10.11.54.png
屏幕快照 2017-01-09 下午10.12.02.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-1-9 23:46:40 | 显示全部楼层    本楼为最佳答案   
其实这类问题不要太纠结,很浪费时间……

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

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

首先 11111111111 这里有 11 个 1(字太小数了半天

因为计算机都是以二进制存储的嘛,对应的二进制数应该是:

1.png

因为我们的编译环境决定了整型(int)是占 4 个字节(并不是所有的编译环境都如此……),每个字节 8 个二进制数存储,所以 4 * 8 == 32。

问了来了,那么这里有 36 位,是取前面的 32 位还是取后面的 32 位好呢?

是取后面……

你想象一下你就往一个桶里倒水,流出来的永远是顶部的(溢出的是高位的字节)

好,取出来是:

10010110010001100001100111000111

那么第 1 位是 1,表示这是一个负数~~

哦,对了,咱这些数(带符号位的整数)在内存中都是以补码的形式存储的,第 1 位符号位。

如果符号位是 0,补码等于原码;如果符号位是 1,补码等于原码取反 +1。

OK,第 1 位符号位是 1,所以除了符号位外,其它位的原码取反加 1 的结果是:

1101001101110011110011000111001

来,放到计算器里看看十进制是多少?

2.png

好了,这就是你想要的答案~~



哦,对了,你可能要问补码是什么鬼?

请看下这篇文章 -> http://bbs.fishc.com/thread-67124-1-1.html



想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2017-1-9 22:21:19 | 显示全部楼层
i是4个字节32位的数据,取值范围为-2147483648~2147483647。
你看好多1个数字。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-9 22:28:11 | 显示全部楼层
代码农民 发表于 2017-1-9 22:21
i是4个字节32位的数据,取值范围为-2147483648~2147483647。
你看好多1个数字。

这我也知道,我想知道的是为什么会这样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-1-9 22:31:20 | 显示全部楼层
代码农民 发表于 2017-1-9 22:21
i是4个字节32位的数据,取值范围为-2147483648~2147483647。
你看好多1个数字。

我想知道的事题中的数字经过怎么过程输出了这个错误的值
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-9 22:34:54 | 显示全部楼层
本帖最后由 代码农民 于 2017-1-9 22:38 编辑
超凡天赐 发表于 2017-1-9 22:31
我想知道的事题中的数字经过怎么过程输出了这个错误的值


这个跟计算机原理有关系,好像数反转了。。具体我也忘了。。你可以找个计算机原理的书看下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-1-9 22:35:38 | 显示全部楼层
11,111,111,111 等于16进位 2,9646,19C7
9646,19C7取%d = -1,773,790,777
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 11:13

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表