一、带符号二进制数表示
1、什么是字长?
计算机数据线一次能传送的最大的二进制数的位数。常用的字长:
8位、 16位、 32位
↓ ↓ ↓
Z80 IBMPC 80386
Apple PC/XT 80486
PC/AT
2、无符号二进制数
在字长范围内,所有二进制位都是数值位。
字长8位: 0~255 00H~FFH
字长16位: 0~65535 0000H~FFFFH
字长32位: 0~4294967295 0000 0000H~FFFF FFFFH
3、有符号二进制数
在字长范围内,最高二进制位为符号位,其余位为数值位。
字长8位:数值范围 80H~7FH -128~+127
字长16位: 8000H~7FFFH -32768~+32767
字长32位: 8000 0000H~7FFF FFFFH -2147483648~+2147483647
二、带符号数的补码表示
在计算机中,任何一个带符号数,都是以补码的形式进行存贮和管理的。
1、带符号数的原码表示
最高位为符号位,其余位是数值位。
[+121]原= 0111 1011 0000000001111011
[-121]原= 1111 1001 1000000001111001
[+0]原= 0000 0000 0000000000000000
[-0]原= 1000 0000 1000000000000000
2、补码表示
(1)正数,同原码
(2)负数,原码的每一位(符号位除外)取反,再在末位加1
例:字长8位,求-11的补码
原码 1000 1011
各位取反 1111 0100
末位加1 1111 0101
例:字长8位,求-0的补码
原码 1000 0000
各位取反 1111 1111
末位加1 0000 0000
还有一种办法可以写出一个负数的补码:
令,则[x]补码=
, n是字长的位数
例: [-1]补= = 1111 1111
[-127]补= = 1000 0001
[-64]补= = 1100 0000
[-5]补= = 1111 1011
[-128]补= = 1000 0000
3、由补码求真值(补码对应的十进制数)
原码就是数字本身,例如:
(+7)的原码=0000 0111 最高位为符号位(0表示正数)
(–7)的原码=1000 0111 最高位为符号位(1表示负数)
反码就是将原码按位求反(符号位不变),例如:
(+7)的反码=0111 1000 符号位不变
(–7)的反码=1111 1000 符号位不变
从计算机运算的角度来讲,“符号位不变,将原码求反再加一”的算法是很方便的,但对于读者理解补码的概念没有多大帮助。
例如:求(–7)的补码。
注意:当负数以补码的形式表示时,求该数的原值仍用“求反再加一”的方法,例如,
如果是正数,就不能用上述方法。正数的补码就是该数的本身,所以本书中不引入“正数的补码就是原码”的概念。
其实补码是针对负数来说的,计算机中只有加法器(没有减法器),引入补码的目的是为了将减法计算变为加法计算。
有了只有负数才有补码的概念后,我们就可将注意力放在负数上。让我们以时钟来说明补码的概念,见表1-1。
表 1-1
时 间 |
逆时针时间 |
0(12) |
(–12) (–12)的补码 = 12 – |–12| = |
1 |
(–11) (–11)的补码 = 12 – |–11| = |
2 |
(–10) (–10)的补码 = 12 – |–10| = |
3 |
(–09) (–9)的补码 = 12 – |–09| = |
4 |
(–08) (–8)的补码 = 12 – |–08| = |
5 |
(–07) (–7)的补码 = 12 – |–07| = |
6 |
(–06) (–6)的补码 = 12 – |–06| = |
7 |
(–05) (–5)的补码 = 12 – |–05| = |
8 |
(–04) (–4)的补码 = 12 – |–04| = |
9 |
(–03) (–3)的补码 = 12 – |–03| = |
10 |
(–02) (–2)的补码 = 12 – |–02| = |
11 |
(–01) (–1)的补码 = 12 – |–01| = |
结论:时间的表示范围:(–12 ~ +11)
(–x)的补码 = 模 – |–x| (模 = 状态的个数0,1,2,…,11)
例如:求时间 –2 的补码。
(–2)的补码 = 12 – |–2| = 10
例如:通过补码将减法转为加法。
11–10 = 11 +(–10)的补码 = 11+2 = 13(13 – 12 = 1)
11–1 = 11 +(–1)的补码 = 11+11 = 22(22 – 12 = 10)
12–12 = 12 +(–12)的补码 = 12+0 = 12(12 – 12 = 0)
将补码用于1个字节:
模==128(模 = 状态的个数 0~127) (127=7FH)
(–1)的补码 = 128 – |–1|=128–1=127(7FH),再加上符号位,即为0FFH
(–2)的补码 = 128 – |–2|=128–2=126(7EH),再加上符号位,即为0FEH
(
(–127)的补码 = 128 – |–127|=128–127=1(01H),再加上符号位,即为81H
(–128)的补码 = 128 – |–128|=128–128=0(00H),再加上符号位,即为80H
1 个字节可表示的数:(–128 ~ 127)
将补码用于1个字:
模==32768(模=状态的个数0~32767) (32767=7FFFH)
(–1)补=32768–|–1|=32768–1=32767(7FFFH),再加上符号位,即为0FFFFH
(–2)补=32768–|–2|=32768–2=32766(7FFEH),再加上符号位,即为0FFFEH
(
(–32767)补=32768–|–32767|=1(0001H),再加上符号位,即为8001H
(–32768)补=32768–|–32768|=0(0000H),再加上符号位,即为8000H
1个字可表示的数:(–32768 ~ 32767)
4、补码的应用
1、补码的运算规则
[x+y]= [x]
+[y]
[x-y]= [x]
+[-y]
2、引进补码后,减法可以变成加法
例1:8-2 = [8]+[-2]
=+6
0000 1000
+ 1111 1110 →-2补码
丢失 ← 1 0000 0110
例2:64-(-10)=[64]+[10]
=74
0100 0000
+ 0000 1010
0100 1010
例3:64-10=[64]+[-10]
=54
0100 0000
+ 1111 0110
1 0011 0110