DAY 发表于 2017-8-19 17:34:22

为什么是-1

本帖最后由 DAY 于 2017-8-19 17:44 编辑

#include<stdio.h>

void main()
{
        unsigned short a = 65535;
        short int b = a;
        printf("%d\n",b);
}
请问一下输出为什么是-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,你的代码数据溢出了。

ba21 发表于 2017-8-19 19:38:19

ba21 发表于 2017-8-19 20:08:16

有认真看解答吧。。。 正在卓尼小乱 错误的解答也能得最佳???{:10_247:}

DAY 发表于 2017-8-19 20:15:32

明白了谢谢大家!

关键点:
一:赋值后变成1111111111111111
二:把上面的二进制转化为补码形式就是-1、
unsigned short 与short int 的区别在于最前面位是符号位(二进制位数相同。)

ba21 发表于 2017-8-19 20:19:24

DAY 发表于 2017-8-19 20:15
明白了谢谢大家!

关键点:

是补码还原成 原码 得 -1
起码也鼓励一下我画这么久图咯,毕竟我的解答才是对的吧{:10_335:}

DAY 发表于 2017-8-19 20:20:38

ba21 发表于 2017-8-19 20:19
起码也鼓励一下我画这么久图咯,毕竟我的解答才是对的吧

当然也谢谢你啦

ba21 发表于 2017-8-19 20:28:48

DAY 发表于 2017-8-19 20:20
当然也谢谢你啦

不客气,不过看你貌似还不是很明白。
另找了个解答给你看看:
1,二进制的储存中都是用的补码
2,正数的原码、反码和补码相同,
3,负数的原码是最高位为1,反码最高位不变,其余各位取反,补码为其反码+1。比如说:-1的原码是10000001(省略几个零),反码是11111110,补码就是11111111。

正在卓尼小乱 发表于 2017-8-19 21:54:36

{:10_245:}呃,无符号型我给弄错了,是我误人子弟了{:10_266:}

DAY 发表于 2017-8-20 11:26:18

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


我确实明白了,我学过计算机组成原理,你一点拨我就知道了。{:5_95:}

正在卓尼小乱 发表于 2017-8-20 12:07:23

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


抢了你的最佳答案真的不好意思,看来我自己也学得没到位。
另外请教一下,65535一开始的16个1是以原码形式存储的吧?然后赋值之后为什么变成了补码形式呢?{:10_282:}

ba21 发表于 2017-8-20 12:14:57

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

{:10_278:}
1,a是以补码形式存储(1111111111111111)
2,赋值给b后,还是(1111111111111111)(2个字节)没问题,也没溢出。还是补码形式
3,(1111111111111111)补码,还原成原码(1000000000000001)

正在卓尼小乱 发表于 2017-8-20 12:21:21

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

16个1不是65535的原码吗?{:10_277:}

正在卓尼小乱 发表于 2017-8-20 12:23:07

1后面16个0是65536,也就是2的16次方,恩,我是怎么个思路......不知道对不对{:10_266:}

ba21 发表于 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。

正在卓尼小乱 发表于 2017-8-20 12:30:07

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

呃,谢谢了,{:10_281:}
页: [1]
查看完整版本: 为什么是-1