机组--原码、补码、反码、移码
首先,对于正数而言,原码=反码=补码
在开始下面内容前,做以下约定:\(X\)表示真值,\([X]_原\)表示原码,\([X]_反\)表示反码,\([X]_补\)表示补码。并且您可能需要一定的将十进制数转化为二进制数的基础。
有符号数与无符号数
-
无符号数:整个机器字长的全部二进制均为数值位
如 :
\(X=+27\)
无符号数为:\(11011\)
-
有符号数:在"无符号数"的最高位添加符号位:
+
:0,-
:1如 :
\(X=+27\)
有符号数为:\(011011\)
\(X=-27\)
有符号数为:\(111011\)
原码
机器数最高位表示符号,其余位表示该数的绝对值
如果规定了机器字长,而我们的原码位数又不够时,需要我们进行补零,之后再修改符号位。
具体的:
-
当为整数时:在有效数值最高位前面补零,不影响整体取值。之后将最高位修改为符号位
假定机器字长为8位
\(X=+27\) ,\([X]_原\):\(00011011\)
\(X=-27\) ,\([X]_原\):\(10011011\)
-
当为小数时:在有效数值最低位后面补零,不影响整体取值。之后再将最高位修改为符号位
假定机器字长为8位(定点小数表现形式可见下方"定点小数")
\(X=+0.625\),\([X]_原\):\([0.1010000]\)
\(X=-0.625\),\([X]_原\):\([1.1010000]\)
值得注意的是,真值0有两种不同形式表达:\([+0]_原=[0000]、[-0]_原=[1000]\)
机器数的定点表示
-
定点小数:纯小数,小数点
.
位置在符号位之后、有效数值部分最高位之前。符号位:+
:0、-
:1,位于最前。这里的纯小数指的是,整数部分为零。\(0.0101\) √、\(1.0101\) ×、
如:\([+0.625]_原 = [0.101]\)、\([-0.125]_原 = [1.001]\)
-
定点整数:纯整数,小数点
.
位置在有效数值位最低位之后。且在最前面用逗号,
将整数部分与符号位隔开如:\([+27]_原\) = \(0,11011\)、 \([-27]_原\) = \(1,11011\)
反码
对于正数,其反码与原码形式一致。
\([+27]_原=00011011\) => \([+27]_反\) = \(00011011\)
\([+0.625]_原=[0.1010000]\) => \([+0.625]_反=[0.1010000]\)
对于负数,将原码的符号位保持不变,其余部分按位取反。
假定机器字长8位
\([-27]_原\) = \(10011011\) => \([-27]_反\) = \(11100100\)
\([-0.625]_原=[1.1010000]\) => \([+0.625]_反=[1.0101111]\)
补码
原码转补码:
对于正数,其补码与原码形式一致。
对于负数,在反码的基础上+1。
\([-27]_原\) = \(10011011\) => $ [-27]_补$= \([-27]_反+1\) = \(11100100\) +1 = \(11100101\)
\([-0.625]_原=[1.1010000]\) => \([-0.625]_补\) = \([-0.625]_反+1=1.0101111+1\) = \(1.0110000\)
另法一:
假设负纯整数X,将其转化为原码共有二进制位数\(N+1\),则X补码为:\([2^{N+1}-|X|]\)
如:X = -13 =\([-1101]\) => \([-1101]_原=[11101]\) ,其中二进制位数为 \(5\) => \(2^5=32\),
因此其 补码为:\([X]_补=32-|-13| = 19 = [10011]\)
另法二:
对负定点小数的原码X,从右往左扫描,尾数的第一个1及其右部的0保持不变,左部的各位取反,符号位保持不变。
如\([X]_原=[1.1110011000]\) =>1.0001101000
补码转原码:
规则:对于负数,补码的除符号位取反后+1
\([-13]_补=[10011]\) =>取反=>\([11100]\) =>+1=>\([-13]_原=[11101]\)
移码
一个真值的移码和补码仅差一个符号位,将补码符号位取反即可得到移码。
附录
一些码的可表示范围:
\(n\) 位码 | 最小值 | 最大值 |
---|---|---|
无符号小数 | 0 | \(1-2^{-n}\) |
无符号整数 | 0 | \(2^n-1\) |
定点小数 | \(-(1-2^{-n})\) | \(1-2^{-n}\) |
定点整数 | \(-(2^{n}-1)\) | \(2^{n}-1\) |
原码纯小数 | \(-(1-2^{-(n-1)})\) | \(1-2^{-(n-1)}\) |
原码纯整数 | \(-(2^{(n-1)}-1)\) | \(2^{(n-1)}-1\) |
反码纯小数 | \(-(1-2^{-(n-1)})\) | \(1-2^{-(n-1)}\) |
反码纯整数 | \(-(2^{(n-1)}-1)\) | \(1-2^{-(n-1)}\) |
补码纯小数 | \(-1\) (比原码多表示\(-1\)) | \(1-2^{-(n-1)}\) |
补码纯整数 | \(-2^n\) (比原码多表示\(-2^n\)) | \(2^{(n-1)}-1\) |