我的疑惑
一个字节8位,其中最高位表示正数和负数,0表示正数,1表示负数。所以能够表示-128~+127。
01111111可以表示+127。正数这一段没有问题,负数这一段有两个疑问
11111111只能表示-127啊,还有10000000表示什么啊,难道是-0。这样没有什么意义啊,其实表示的就是-128,但是在计算中又会出现问题,比如数学上,1+(-1)=0,而在二进制中00000001+10000001=10000010,换算成十进制为-2。
解决问题
其实在计算机里面将正数都保存成了补码。对于正数的补码是它本身,对于负数的补码是其反码+1(反码:将二进制数按位取反)。我们举个例子
127-128,一般在计算机中都是使用加法的。
127 | -128 | |
原码 | 01111111 | 10000000 |
反码 | 11111111 | |
补码 | 01111111 | 10000000 |
127 01111111
-128 10000000
11111111因为这个是补码,转为反码就是11111110,原码是10000001=-1
为什么8位二进制的取值范围是-128~127,指的是补码的范围。
一个有意思的发现
里面的模-负数绝对值的原码=补码(可以看第一个参考地址)
我对模的定义,每一位二进制都可以存2个数,也就是它的容量。对于一个字节8位二进制,它的模是=256,也就是-128~+127里面中整数的个数。
扫描二维码关注公众号,回复:
9745932 查看本文章
参考
第一个比较经典