首页 新闻 会员 周边 捐助

诡异的1000 0000 0000 0000和-32768

0
[待解决问题]

用int举例子,假如int的长度是16位 

 

为什么signed int的范围是-32768 – 32767?

解释一:

因为二进制的负数是用补码表示的,2字节也就是16bit,可以有2^16种状态,也就是65536.

如果表示有符号数,那么首位为1的都是负数,为零的非负。

所以65536除以2就是可以表示的负数个数,从-32768到-1.

因为非负里面包含零,所以范围是0-32767.

所以总的范围就是-32768-32767。

 

解释二:

如果以最高位为符号位,二进制原码最大为0111  1111  1111  1111 =  215 - 1 =32767

                                             最小为1111  1111  1111  1111 =-215 - 1=-32767

此时0有两种表示方法,即正0和负0:0000  0000  0000  0000 = 1000  0000  0000  0000 = 0

所以,二进制原码表示时,范围是-32767~-0和0~32767,因为有两个零的存在,所以不同的数值个数一共只有2的16次方减1个,比16位二进制能够提供的2的16次方个编码少1个。

但是计算机中采用二进制补码存储数据,即正数编码不变,从0000  0000  0000  0000到0111  1111  1111  1111依旧表示0到32767,而负数需要把除符号位以后的部分取反加1,即-32767的补码为1000  0000  0000  0001。

到此,再来看原码的正0和负0:0000000000000000和1000000000000000,补码表示中,前者的补码还是0000000000000000,后者经过非符号位取反加1后,同样变成了0000  0000  0000  0000,也就是正0和负0在补码系统中的编码是一样的。但是,我们知道,16位二进制数可以表示2的16次方个编码,而在补码中零的编码只有一个,也就是补码中会比原码多一个编码出来,这个编码就是1000000000000000,因为任何一个原码都不可能在转成补码时变成1000  0000  0000  0000。所以,人为规定1000  0000  0000  0000这个补码编码为-32768。

所以,补码系统中,范围是-32768 – 32767。

因此,实际上,二进制的最小数确实是1111111111111111,只是二进制补码的最小值才是1000000000000000,而补码的1111111111111111是二进制值的-1。

重点是:

1.负数在计算机中是补码表示的!

2.正0和负0在计算机里面表示重叠了

3.人为规定负数里面1000 0000 0000 0000是负数里面最小的,-32768就是它。

 

解释三:

补码

数值的补码表示也分两种情况: 

(1)正数的补码:与原码相同。 例如,+9的补码是00001001。 

(2)负数的补码:符号位为1,其余位为该数绝对值的原码按位取反;然后整个数加1。 

例如,-7的补码:因为是负数,则符号位为“1”,整个为1000 0111;其余7位为-7的绝对值+7的原码000 0111按位取反为111 1000;再加1,所以-7的补码是1111 1001。 

 

已知一个数的补码,求原码的操作分两种情况: 

(1)如果补码的符号位为“0”,表示是一个正数,所以补码就是该数的原码。 

(2)如果补码的符号位为“1”,表示是一个负数,求原码的操作可以是:符号位为1,其余各位取反,然后再整个数加1。 例如,已知一个补码为

1111 1001,则原码是1000 0111(-7):因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”;其余7位111 1001取反后为000 0110;再加1,所以是10000111。

 

-32768是怎样计算得到的?

首先在计算机中数字被表示成二进制形式,计算-32768的方法:最高位是1时表示负数,剩余位000 0000 0000 0000按位取反为111 1111 1111 1111再加一,在得到的结果前加上一个符号,此时得:1000 0000 0000 0000,为32768,所以原数为-32768。

 

综上所述,问题描述如下:

1000 0000 0000 0000在计算机中表示为-32768是人为规定的还是根据补码转化为反码得来的,还有蓝色底色的字体描述得是否正确(1000 0000 0000 0000 (负0)的补码应该就是本身啊,怎么会变成了0000 0000 0000 0000)?

Lin GH的主页 Lin GH | 菜鸟二级 | 园豆:202
提问于:2014-05-22 15:34
< >
分享
所有回答(1)
0

2.补码解决了正0 负0的二义性,使0的表示得到统一;
  正零:00000000
  负零:10000000
  这两个数其实都是0,但他们的原码却有不同的表示。
  但是他们的补码是一样的,都是00000000

Launcher | 园豆:45050 (高人七级) | 2014-05-22 15:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册