计算机中的数是用二进制来表示。数的符号也是用二进制表示的。在机器中,把一个数连同其符号在内数值化表示的数成为机器数。机器数能够用不一样的码制来表示,经常使用的有原码、补码、反码表示法。通常用最高有效位表示数的符号,正数用0表示,负数用1表示。post
原码由真值得来,真值(人理解的数 +3 -3 +1.5 -1.5)是一个变量自己所具备的真实值,是一个理想概念,通常没法获得。spa
整数 | +5D | -5D |
1 取绝对值 | [+5]真值→|+5|=5 | [-5]真值→|-5|=5 |
2 化二进制 | (5)10=(0101)2=0101B | (5)10=(0101)2=0101B |
3 加正负号(此时位机器真值) | 0101B加符号 → +0101B机器真值 | 0101B加符号 → -0101B机器真值 |
4 标准化blog (符号位正为0负为1,尾数外中间补0)get |
+0101B=0 000 0101B | -0101B=1 000 0101B |
[+5]原码=0 000 0101B | [-5]原码=1 000 0101B |
纯小数 | +0.8125D | -0.8125D |
1 取绝对值 | |+0.8125|=0.8125 | |-0.8125|=0.8125 |
2 化二进制 | (0.8125)10=(0.1101)2=0.1101B | (0.8125)10=(0.1101)2=0.1101B |
3 加正负号 | 0.1101B加符号 → +0.1101 | 0.1101B加符号 → -0.1101B机器真值 |
4 标准化it (符号位正为0负为1,右补足8位)io |
+0.1101B=0.1101 000B | -0.1101B=1.1101 000B |
[+0.8125]原码=0.1101 000B | [-0.8125]原码=1.1101 000B |
纯小数表示范围为(-1,1),因此8位0.1101 000B存储为0110 1000,并不会和0110 1000表示的整数冲突table
正数 原码、反码、补码 同样基础
负数 反码在原码基础上,符号位不变,其余位按位取反变量
整 | 正 | [+5]反=[+5]补=[+5]原=0 000 0101B | |
负 | [-5]原= 1 000 0101 B | [-5]补=[-5]反+1=111 1011B扩展 末位加一 |
|
符号位不变↓↓其他按位取反 | |||
[-5]反= 1 111 1010 B | |||
小 | 正 | [+0.8125]反=[+0.8125]补=[+0.8125]原=0.1101 000 B | |
负 | [-0.8125]原=1.1101 000 | [-0.8125]补=[-0.8125]反+0.000 0001 =1.001 0111+0.000 0001=1.001 1000 |
|
符号位不变↓↓其他按位取反 | |||
[-0.8125]反=1.0010 111 |
补码表示法中,
正数采用 符号-绝对值 表示,即数的最高有效位为0表示正,数的其他部分则表示数的绝对值
机器字长8位:
[+1]补 = 0 000 0001
[+127]补 = 0 111 111
[+0]补 = 0000 0000
补码表示负数,n位机器字长表示负数X为 2n-|X|
机器字长8位:
[-1]补 = 28-1 = 1 111 1111
[-127]补 = 28-127 = 1 000 0001
[-0]补 = 28-0 = 0000 0000
注意
补码表示法中0只有一种表示即 0000 0000
对于1000 0000,在补码表示法中被定义为 -128
8位 | 原码 | 反码 | 补码 |
+0 | 0000 0000 | 0000 0000 | 0000 0000 |
-0 | 1000 0000 | 1111 1111 | 1 0000 0000 cf=1 |
范围 | -127D˜127D | -127D˜127D | -128D˜127D |
8位能够表示28个不一样的数,+0和-0补码都是0000 0000,空一个表示-128
正数
原码、反码、补码 同样
负数
法一:补码在反码基础上,末位加一
整 | 正 | [+5]反=[+5]补=[+5]原=0 000 0101B | |
负 | [-5]原= 1 000 0101 B | [-5]补=[-5]反+1=111 1011B 末位加一 |
|
符号位不变↓↓其他按位取反 | |||
[-5]反= 1 111 1010 B | |||
小 | 正 | [+0.8125]反=[+0.8125]补=[+0.8125]原=0.1101 000 B | |
负 | [-0.8125]原=1.1101 000 | [-0.8125]补=[-0.8125]反+0.000 0001 =1.001 0111+0.000 0001=1.001 1000 |
|
符号位不变↓↓其他按位取反 | |||
[-0.8125]反=1.0010 111 |
法二:对于一个正数的补码表示 按位求反后再在末位加一 能够获得与此正数相对于的负数的补码表示
机器字长为8位 | 机器字长为16为 | |
-46D的补码 | -117D的补码 | |
1 先写出与该数相对应的 正数的补码表示(符号-绝对值法) |
+46D的补码表示为 0010 1110 |
+117D的补码表示为 0000 0000 0111 0101 |
2 将其按位取反 | 1101 0001 | 1111 1111 1000 1010 |
3 在末位(最低位)加一 | 1101 0010 | 1111 1111 1000 1011 |
4 用十六进制表示 | D 2 | F F 8 B |
5 结果 | [-46]补 = D2H | [-117]补 = FF8BH |
定义
对于一个二进制数→按位求反→在末位加一 的运算称为求补运算
推理
补码表示的数具备如下特性:
[X]补 求补得› [-X]补 求补得› [X]补
[117]补=0075H | [-117]补=FF8BH | |
对[-117]补 做求补运算 |
[-117]补为 | 1111 1111 1000 1011 |
按位求反后得 | 0000 0000 0111 0100 | |
末位加一后得 | 0000 0000 0111 0101 | |
[-117]补为 | 0000 0000 0111 0101 |
补码的加法规则:
[X+Y]补 = [X]补 + [Y]补
补码的减法规则:
[X-Y]补 = [X]补 + [-Y]补
其中[-Y]补 只要对[Y]补求补就可获得
[Y]补 → 因此位按位取反 → 末位加一 → [-Y]补
十进制 | 二进制 | ||
+25 | 0001 1001 | ||
+ | +32 | + | 0010 0000 |
= | 57 | = | 0011 1001 |
+32 | 0010 0000 | ||
+ | -25 | + | 1110 0111 |
= | 7 | = | 0000 0111 |
↓1 | |||
-25 | 1110 0111 | ||
+ | -32 | + | 1110 0000 |
= | -57 | = | 1100 0111 |
↓1 | |||
25 | 0001 1001 | ||
+ | -32 | + | 1110 0000 |
= | -7 | = | 1111 1001 |
十进制 | 二进制 | ||||
25 | 0001 1001 | 0001 1001 | |||
- | 32 | - | 0010 0000 | + | 1110 0000 |
= | -7 | 对减数求补换成加法 | = | 1111 1001 | |
-25 | 1110 0111 | 1110 0111 | |||
- | -32 | - | 1110 0000 | + | 0010 0000 |
= | 7 | 对减数求补换成加法 | = | 0000 0111 | |
↓1 |
符号扩展是指一个数从位数较少扩展到位数较多(如从8为扩展到16位,或从16位扩展到32位)
补码表示数的符号扩展,对于补码表示的数,正数的符号扩展应该在前面补0,而负数扩展则应该在前面补1
机器字长为8位 | [+46]补= 0010 1110 | [-46]补= 1101 0010 |
扩展到16位 | [+46]补= 0000 0000 0010 1110 | [-46]补= 1111 1111 1101 0010 |
通常来讲n位补码表示的数的表示范围是 -2n-1 ≤ N ≤ 2n-1-1
8位二进制数能够表示28=256个数,当他们是补码表示带符号数时,他们表数范围为-128 ≤ N ≤ +127
n=16时的表数范围是-32768 ≤ N ≤ +32767
为了扩大表数范围,在机器里,能够用二个机器字(低位字和高位字)来表示一个机器数,这种数称为双字长数或双精度数,其中高位字的最高有效位为符号位。
机器字长为16位为例,高位字的低15位和整个低位字的16位联合组成31位数来表示数值,于是低位字的最高有效位没有符号意义只有数值意义,双字长数的表数范围可扩大到 -231 ≤ N ≤ 231-1
15 | 14 0 | 15 0 |
符号 | 高位字 | 低位字 |
补码值 |