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