一、带符号二进制数表示
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| = |