鱼C论坛

 找回密码
 立即注册
查看: 1809|回复: 15

[已解决]为什么是-1

[复制链接]
发表于 2017-8-19 17:34:22 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 DAY 于 2017-8-19 17:44 编辑
  1. #include<stdio.h>

  2. void main()
  3. {
  4.         unsigned short a = 65535;
  5.         short int b = a;
  6.         printf("%d\n",b);
  7. }
复制代码

请问一下输出为什么是-1
最佳答案
2017-8-19 18:10:07
如果你的电脑短整型无符号数和短整型的字长都是2的话。
那unsigned short型的取值范围是0~65535,而short int是 -32768~32767.
把65535赋给short int型变量b,当数据到32767的时候,它的二进制是0111111111111111,超出了32768........这里最高位是符号位,1表示正,0表示负。
+1之后变成1后面15个0,然后在从最后一位加1,一值加32767之后(011111~这里加了1,所以从32768变成了32767),就加成了-1。
所以最后的输出结果为-1,你的代码数据溢出了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-19 18:10:07 | 显示全部楼层    本楼为最佳答案   
如果你的电脑短整型无符号数和短整型的字长都是2的话。
那unsigned short型的取值范围是0~65535,而short int是 -32768~32767.
把65535赋给short int型变量b,当数据到32767的时候,它的二进制是0111111111111111,超出了32768........这里最高位是符号位,1表示正,0表示负。
+1之后变成1后面15个0,然后在从最后一位加1,一值加32767之后(011111~这里加了1,所以从32768变成了32767),就加成了-1。
所以最后的输出结果为-1,你的代码数据溢出了。

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
DAY + 1 + 1 谢谢

查看全部评分

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

使用道具 举报

发表于 2017-8-19 19:38:19 | 显示全部楼层
2017-08-19_193603.png

评分

参与人数 1荣誉 +1 鱼币 +1 收起 理由
DAY + 1 + 1 Thanks

查看全部评分

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

使用道具 举报

发表于 2017-8-19 20:08:16 | 显示全部楼层
有认真看解答吧。。。 正在卓尼小乱 错误的解答也能得最佳???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-19 20:15:32 | 显示全部楼层
明白了谢谢大家!

关键点:
一:赋值后变成1111111111111111
二:把上面的二进制转化为补码形式就是-1、
unsigned short 与short int 的区别在于最前面位是符号位(二进制位数相同。)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-19 20:19:24 | 显示全部楼层
DAY 发表于 2017-8-19 20:15
明白了谢谢大家!

关键点:

是补码还原成 原码 得 -1
起码也鼓励一下我画这么久图咯,毕竟我的解答才是对的吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2017-8-19 20:20:38 | 显示全部楼层
ba21 发表于 2017-8-19 20:19
起码也鼓励一下我画这么久图咯,毕竟我的解答才是对的吧

当然也谢谢你啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-19 20:28:48 | 显示全部楼层
DAY 发表于 2017-8-19 20:20
当然也谢谢你啦

不客气,不过看你貌似还不是很明白。
另找了个解答给你看看:
1,二进制的储存中都是用的补码
2,正数的原码、反码和补码相同,
3,负数的原码是最高位为1,反码最高位不变,其余各位取反,补码为其反码+1。比如说:-1的原码是10000001(省略几个零),反码是11111110,补码就是11111111。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-19 21:54:36 | 显示全部楼层
呃,无符号型我给弄错了,是我误人子弟了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-20 11:26:18 | 显示全部楼层
ba21 发表于 2017-8-19 20:28
不客气,不过看你貌似还不是很明白。
另找了个解答给你看看:
1,二进制的储存中都是用的补码

我确实明白了,我学过计算机组成原理,你一点拨我就知道了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-20 12:07:23 | 显示全部楼层
ba21 发表于 2017-8-19 20:28
不客气,不过看你貌似还不是很明白。
另找了个解答给你看看:
1,二进制的储存中都是用的补码

抢了你的最佳答案真的不好意思,看来我自己也学得没到位。
另外请教一下,65535一开始的16个1是以原码形式存储的吧?然后赋值之后为什么变成了补码形式呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-20 12:14:57 | 显示全部楼层
正在卓尼小乱 发表于 2017-8-20 12:07
抢了你的最佳答案真的不好意思,看来我自己也学得没到位。
另外请教一下,65535一开始的16个1是以原码形 ...


1,a是以补码形式存储(1111111111111111)
2,赋值给b后,还是(1111111111111111)(2个字节)没问题,也没溢出。还是补码形式
3,(1111111111111111)补码,还原成原码(1000000000000001)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-20 12:21:21 | 显示全部楼层
ba21 发表于 2017-8-20 12:14
1,a是以补码形式存储(1111111111111111)
2,赋值给b后,还是(1111111111111111)(2个字 ...

16个1不是65535的原码吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-20 12:23:07 | 显示全部楼层
1后面16个0是65536,也就是2的16次方,恩,我是怎么个思路......不知道对不对
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-20 12:29:15 | 显示全部楼层
正在卓尼小乱 发表于 2017-8-20 12:23
1后面16个0是65536,也就是2的16次方,恩,我是怎么个思路......不知道对不对

1,二进制的储存中都是用的补码
2,正数的原码、反码和补码相同,
3,负数的原码是最高位为1,反码最高位不变,其余各位取反,补码为其反码+1。比如说:-1的原码是10000001(省略几个零),反码是11111110,补码就是11111111。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-20 12:30:07 | 显示全部楼层
ba21 发表于 2017-8-20 12:29
1,二进制的储存中都是用的补码
2,正数的原码、反码和补码相同,
3,负数的原码是最高位为1,反码最高 ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 16:41

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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