一、概述
- 真值:十进制、二进制、八进制、十六进制等用来表示实际数值的数
- 机器数:数在计算机中的表示形式
- 原码:正数是其二进制本身;负数是符号位为1,数值部分取X绝对值的二进制
- 反码:正数的反码和原码相同;负数是符号位为1,其它位是原码取反
- 补码:正数的补码和原码,反码相同;负数是符号位为1,其它位是原码取反,未位加1。(或者说负数的补码是其绝对值反码未位加1)
现代计算机中普遍使用补码表示法,而不是原码
编码 | 108(十进制) | -108(十进制) |
---|---|---|
原码 | 01101100 | 11101100 |
反码 | 01101100 | 10010011 |
补码 | 01101100 | 10010100 |
二、原码
原码就是符号位和真值的绝对值组成的
[+1] = [00000001]原
[-1] = [10000001]原
三、反码
反码,主要用于原码和补码的相互转换,反码作为中间数过渡使用
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
四、补码
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
1.补数和模
例如,时钟指针指向6,要是它指向3,可以让指针逆时针方向走3格,也可以让指针顺时针方向走6格。
在数学上,称时钟的12格为模,写作mod12,而称+9是-3以12为模的补数。对于模12而言,-3和+9是互为补数的。
只要确定一个模,就可以找到一个与负数等价的正数来代替该负数,而这个得到的正数,即为负数的补数。
结论一:负数的绝对值,和它的补数相加,就是模
结论二:负数和模相加,得到该负数对应的正数补数
利用补数和模,可以把减法转化为加法:
A是9,B是5,对于模12,-5的补数是7
A - B = 9 - 5 = 4
A - B = 9 + 7 = 16 = 4(mod 12)
对于二进制,有:
−1011 ≡ +0101 (mod 24)
−0101 ≡ +0101 (mod 24)
−0.1001 ≡ +1.0111 (mod 2)
+0.1001 ≡ +0.1001 (mod 2)
2.补码
补数的出现,可以让原本作减法的式子变成加法
负数的补数为正数,但负数的补码前的符号位依然是负符号为1,即符号位与原数保持一致
例如,A = 1110,B = 1101
A - B = [0,1110]原 - [0,1101]原 = [0,0001]原 (mod 24)
A - B = [0,1110]补 + [1,0011]补 = [10,0001]补 = [0,0001]补 = [0,0001]原 (mod 24)
补码运算的运算的符号位进位溢出
五、表示范围
二进制编码 | 无符号数 | 原码 | 反码 | 补码 |
---|---|---|---|---|
0000 0000 | 0 | +0 | +0 | +0 |
0000 0001 | 1 | +1 | +1 | +1 |
0000 0010 | 2 | +2 | +2 | +2 |
... | ... | ... | ... | ... |
0111 1101 | 125 | +125 | +125 | +125 |
0111 1110 | 126 | +126 | +126 | +126 |
0111 1111 | 127 | +127 | +127 | +127 |
1000 0000 | 128 | -0 | -127 | -128 |
1000 0001 | 129 | -1 | -126 | -127 |
1000 0010 | 130 | -2 | -125 | -126 |
... | ... | ... | ... | ... |
1111 1101 | 253 | -125 | -2 | -3 |
1111 1110 | 254 | -126 | -1 | -2 |
1111 1111 | 255 | -127 | -0 | -1 |