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