为什么是-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
如果你的电脑短整型无符号数和短整型的字长都是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,你的代码数据溢出了。 有认真看解答吧。。。 正在卓尼小乱 错误的解答也能得最佳???{:10_247:} 明白了谢谢大家!
关键点:
一:赋值后变成1111111111111111
二:把上面的二进制转化为补码形式就是-1、
unsigned short 与short int 的区别在于最前面位是符号位(二进制位数相同。) DAY 发表于 2017-8-19 20:15
明白了谢谢大家!
关键点:
是补码还原成 原码 得 -1
起码也鼓励一下我画这么久图咯,毕竟我的解答才是对的吧{:10_335:} ba21 发表于 2017-8-19 20:19
起码也鼓励一下我画这么久图咯,毕竟我的解答才是对的吧
当然也谢谢你啦 DAY 发表于 2017-8-19 20:20
当然也谢谢你啦
不客气,不过看你貌似还不是很明白。
另找了个解答给你看看:
1,二进制的储存中都是用的补码
2,正数的原码、反码和补码相同,
3,负数的原码是最高位为1,反码最高位不变,其余各位取反,补码为其反码+1。比如说:-1的原码是10000001(省略几个零),反码是11111110,补码就是11111111。 {:10_245:}呃,无符号型我给弄错了,是我误人子弟了{:10_266:} ba21 发表于 2017-8-19 20:28
不客气,不过看你貌似还不是很明白。
另找了个解答给你看看:
1,二进制的储存中都是用的补码
我确实明白了,我学过计算机组成原理,你一点拨我就知道了。{:5_95:} ba21 发表于 2017-8-19 20:28
不客气,不过看你貌似还不是很明白。
另找了个解答给你看看:
1,二进制的储存中都是用的补码
抢了你的最佳答案真的不好意思,看来我自己也学得没到位。
另外请教一下,65535一开始的16个1是以原码形式存储的吧?然后赋值之后为什么变成了补码形式呢?{:10_282:} 正在卓尼小乱 发表于 2017-8-20 12:07
抢了你的最佳答案真的不好意思,看来我自己也学得没到位。
另外请教一下,65535一开始的16个1是以原码形 ...
{:10_278:}
1,a是以补码形式存储(1111111111111111)
2,赋值给b后,还是(1111111111111111)(2个字节)没问题,也没溢出。还是补码形式
3,(1111111111111111)补码,还原成原码(1000000000000001) ba21 发表于 2017-8-20 12:14
1,a是以补码形式存储(1111111111111111)
2,赋值给b后,还是(1111111111111111)(2个字 ...
16个1不是65535的原码吗?{:10_277:} 1后面16个0是65536,也就是2的16次方,恩,我是怎么个思路......不知道对不对{:10_266:} 正在卓尼小乱 发表于 2017-8-20 12:23
1后面16个0是65536,也就是2的16次方,恩,我是怎么个思路......不知道对不对
1,二进制的储存中都是用的补码
2,正数的原码、反码和补码相同,
3,负数的原码是最高位为1,反码最高位不变,其余各位取反,补码为其反码+1。比如说:-1的原码是10000001(省略几个零),反码是11111110,补码就是11111111。 ba21 发表于 2017-8-20 12:29
1,二进制的储存中都是用的补码
2,正数的原码、反码和补码相同,
3,负数的原码是最高位为1,反码最高 ...
呃,谢谢了,{:10_281:}
页:
[1]