本文介绍原码、反码和补码.
1. 数据、机器数与真值
1.1 计算机中的数据
在计算机中规定采用字节(Byte)、字(Word)、双字(Double Word)等单位表示数据.
- 字节(Byte):8 位二进制数. 如 0000 0101 B,或表示成 05H;10000101B,或表示成85H.
- 字(Word):16 位二进制数,等于 2 字节. 如 1100 0101 1101 0110 B,或表示成C5D6H.
- 双字(Double Word):32 位十进制数,又称为双精度数,等于 4 字节. 如 23456789H.
1.2 机器数与真值
? 在计算机中,对带符号数可用真值和机器数来表示. 所谓真值,就是带有 “+”、“-” 号的实际数值;所谓机器数,则是把 “+”、“-” 号数值化后所得到计算机实际能表示的数.
? 在下面的描述中,规定二进制数以字节、字或双字表示. 当十进制转换为二进制数时,不够8位或16位,高位用0补齐. 为简便,以下均以字节机器数为例.
? 机器数有三种码表示,分别是原码、反码和补码. 汇编语言中,数都是以补码的形式表示的,因此必须掌握数的补码表示和补码的运算.
2. 原码、反码和补码
2.1 定义
- 原码:原码将最高位作为符号位,正数为0,负数为1,其余7位作为数值位.
- 反码:正数的反码与正数的原码一样. 而求负数的反码时,符号位为1,数值位在原码的基础上求反.
- 补码:正数的补码与正数的原码一样. 求负数的补码时,符号位为1,数值位在原码的基础上求反加1.
例 1 ? 十进制数 +5 和 -5 分别表示成二进制数原码、反码和补码.
[ + 5 ] 原 = [ + 5 ] 反 = [ + 5 ] 补 = 0000 0101 B [+5]_{原}=[+5]_{反}=[+5]_{补}=0000\text{ }0101\text{ B} [+5]原?=[+5]反?=[+5]补?=0000 0101 B
[ ? 5 ] 原 = 1000 0101 B [-5]_{原}=1000\text{ }0101\text{ B} [?5]原?=1000 0101 B
[ ? 5 ] 反 = 1111 1010 B [-5]_{反}=1111\text{ }1010\text{ B} [?5]反?=1111 1010 B
[ ? 5 ] 补 = 1111 1011 B [-5]_{补}=1111\text{ }1011\text{ B} [?5]补?=1111 1011 B
例 2 ? 变量 x x x、 y y y 是十进制数. x = 106 x=106 x=106, y = ? 106 y=-106 y=?106,求其原码、反码和补码.
原码:
[ x ] 原 = 0110 1010 B = 6A H [x]_{原}=0110\text{ }1010\text{ B}=\text{6A H} [x]原?=0110 1010 B=6A H
[ y ] 原 = 1110 1010 B = EA H [y]_{原}=1110\text{ }1010\text{ B}=\text{EA H} [y]原?=1110 1010 B=EA H
反码:
[ x ] 反 = 0110 1010 B [x]_{反}=0110\text{ }1010\text{ B} [x]反?=0110 1010 B
[ y ] 反 = 1001 0101 B [y]_{反}=1001\text{ }0101\text{ B} [y]反?=1001 0101 B
补码:
[ x ] 补 = 0110 1010 B [x]_{补}=0110\text{ }1010\text{ B} [x]补?=0110 1010 B
[ y ] 补 = 1001 0110 B [y]_{补}=1001\text{ }0110\text{ B} [y]补?=1001 0110 B
2.2 用公式求补码
[ x ] 补 = 2 n ? ∣ x ∣ [x]_{补}=2^n-|x| [x]补?=2n?∣x∣ ? 其中, n n n等于二进制位数.
例 3 ? n = 8 n=8 n=8,求 [ ? 5 ] 补 [-5]_{补} [?5]补?, [ ? 128 ] 补 [-128]_{补} [?128]补? .
[ ? 5 ] 补 = 2 8 ? 5 = 1 0000 0000 B ? 101 B = 1111 1011 B = FB H [-5]_{补}=2^8-5=1\text{ }0000\text{ }0000\text{ B}-101\text{ B}=1111\text{ }1011\text{ B}=\text{FB H} [?5]补?=28?5=1 0000 0000 B?101 B=1111 1011 B=FB H
[ ? 128 ] 补 = 2 8 ? 128 = 1 0000 0000 B ? 1000 0000 B = 1000 0000 B = 80 H [-128]_{补}=2^8-128=1\text{ }0000\text{ }0000\text{ B}-1000\text{ }0000\text{ B}=1000\text{ }0000\text{ B}=\text{80 H} [?128]补?=28?128=1 0000 0000 B?1000 0000 B=1000 0000 B=80 H
2.3 从补码求真值
对负数补码的数值位再求反加1,且符号位变成 “-”,就得到其真值. 正数直接从补码得到真值.
例 3 ? 给出补码,求其十进制真值.
0010 0010 B = [ + 34 ] 补 0010\text{ }0010\text{ B}=[+34]_{补} 0010 0010 B=[+34]补?
1001 0011 B = ? 110 1101 B = [ ? 109 ] 补 1001\text{ }0011\text{ B}=-110\text{ }1101\text{ B}=[-109]_{补} 1001 0011 B=?110 1101 B=[?109]补?