8位编码范围表汇总
1、原码
源码的范围:-127 ~ +127,最高位是符号位,0表示正数,1表示负数
[+127]原 = 0111 1111
[-127]原 = 1111 1111
数值“0”由两种原码表示形式:
[+0]原 = 0000 0000
[-0]原 = 1000 0000
2、反码
源码的范围:-127 ~ +127,最高位是符号位,0表示正数,1表示负数
[+127]反 = 0111 1111
[-127]反 = 1000 0000
数值“0”由两种反码表示形式:
[+0]反 = 0000 0000
[-0]反 = 1111 1111
3、补码
源码的范围:-128 ~ +127,最高位是符号位,0表示正数,1表示负数
[+127]补 = 0111 1111
[-128]补 = 1000 0000
因为 [-127]反 = 1000 0000 而 [-127]补 = 反 + 1 = 1 0000001
所以 [-128]补 = 1000 0000
哈哈,看明白了吗,懂了吗,其实你没懂
注意:补码比原码和反码多表示一个负数,即 -128.
数值“0”只有一种补码表示形式:
**[+0]补 = [+0]反 = 0 0000000
如果 [-0]补 = [-0]反 +1 = 1 1111111 + 1 = 1 00000000,这个结果是用来表示 -128,而8位字长的0000 0000是表示[+0]的,产生冲突。 所以0只有一种补码形式 **
其中反码+1,结果只保留低位的7位数字位,溢出的会置位溢出,而结果只保留低七位
注意到补码中,最大数是符号位为0,数值位全1
最小数是符号位为1,数值位全0
你肯定会问了,1000 0000为什么表示 -128呀,取反加一不对呀。嗷嗷的。
说白了,补码就是同余。1000 0000是正128你知道吧,正负128模256是同余的。加减乘可以直接算也是同余的定理决定的,而不是凑出来的巧合,哪可能凑出这种东西?8位只能表示256个数,0到255,但我还想表示一些负数怎么办呢?就用与该负数同余的正数来表示呗。-1=255,-2=254,等等。**建议脱离算数的思维方式,这其实就是一个环。**模任何一个正整数(如256),可以把所有整数分类,比如模256可分256类,0、256、-256…是一类(余0类),1、257、-255…是一类(余1类),等等,这256类可看作环的元素,你看-128和128是同一个类里的(余128类),用一个代表另一个罢了。补码和普通的unsigned integers都是在每类中选一个数,unsigned integers选0到255,补码表示的有符号整数选-128到127,都是一个数恰好对应一个类。当你明白这一切后,补码就是顺理成章的事。要求作加减乘运算的时候,可以直接把编码当正整数算,能得到正确结果。
补数
一对补数,两者之间的绝对值之和等于模,即 -a 的补数 = 模 - a的绝对值
在数论中,有 取模结果相同的数,定义为一类数
这样,两个数的减法操作就容易用加法操作进行替换,计算机里通常是使用两个数的补码的加法进行替换减法操作。
例如,时钟里面 10 - 3 = 10 + 9, 其中 9 = (-3) mod 12
4、带符号编码之间的换算