数值的编码表示
整数编码表示
在计算机中,因为只有0和1这两种形式,但为了表示数的正(+),负(-)号,就要将数的符号以0和1编码。
通常把一个数的最高位定义为符号位,用0表示正,1表示负,称为数符,这种把数本身(数值部分)及符号一起数字化的数称为机器数。
机器数是数在计算机内的表示形式,而这个数真正表示的数值称为真值
假设计算机字长为8,然后介绍它的原码、反码和补码
原码
整数 X 的原码指其数符位 0 表示正,1 表示负。其数值部分就是X绝对值的二进制表示。
通常用 [X] ~原~表示X的原码
示例:
- [ +1 ]~原~=00000001 [ +127 ]~原~=01111111
- [ -1 ]~原~=10000001 [ -1 ]~原~=11111111
由此可知,8位原码表示的最大值为2^7^-1,即是127,最小值为---127,所能表示数的范围为[-127,127]
当采用原码表示时,编码简单,与真值转换方便。但原码也存在以下一些问题
- 在原码表示中,0有两种表示形式,即 [ +0 ]~原~=00000000,[ -0 ]~原~=10000000。零的二义性给机器判断带来了麻烦
- 原码进行四则运算时,符号位需要单独处理,增加了运算规则的复杂性
反码
整数X 的反码指对于正数,与原码相同;但对于负数,数符位为1,其数值位是X的绝对值取反。通常用 [X ]~反~表示 X 的反码
示例:
- [ +1 ]~反~=00000001 [ +127 ]~反~=01111111
- [ -1 ]~反~=11111110 [ -127 ]~反~=10000000
由此可知,8位反码表示的最大值、最小值和所能表示数的范围与原码相同。
反码运算也不方便,很少使用,一般用作求补码的中间码
补码
正数 X 的补码指对于正数,与原码、补码相同;但对于负数,数符位为1,其数值位是X的绝对值取反后再在最低位加1,即为反码加1
通常用 [ X ]~补~表示 X 的补码
示例:
- [ +1 ]~补~=00000001 [ +127 ]~补~=01111111
- [ -1 ]~补~=11111111 [ -127 ]~补~=10000001
在补码表示中,0有唯一的编码,即[ +0 ]~补~=[ -0 ]~补~=00000000,因而可以用多出来的一个编码10000000来扩展补码所能表示的数值范围,即将负数由最小-127扩大到-128。这里的最高位1即可看作符号位,又可表示为数值位,其值即为-128,补码所能表示数的范围为[-128,127]。这就是补码与原码、反码最小值不同的原因。利用补码可以方便地进行运算
总结
对于正数 X:[ X ]~原~=[ X ]~反~=[ X ]~补~
对于反数 Y:
- [ Y ]~原~=数符位为1,其他位为绝对值的二进制形式;
- [ Y ]~反~=数符位为1,其余位按位取反
- [ Y ]~补~=[ Y ]~反~+1
实数编码表示
在计算机中小数点是不占位置的,因此规定根据小数点所在的位置来表示,分别为定点整数、定点小数和浮点数这三种表示形式
定点整数
定点整数是纯整数,是指在计算机内部表示时,小数点被固定在机器数的最右边。定点整数可分为有符号数和无符号数(正整数)。
-
有符号数最高一位二进制表示符号(0表示正号且1表示负号),其余各位表示数据。
-
不带符号位时所有的二进制位数都用来表示数据
无符号整数的表示
字长为n位的计算机,它能表示的无符号整数的范围是0~2^n^-1
字长为8位的计算机,它的整数范围是:0~255(00000000B~11111111B)
字长为16位的计算机,它的整数范围是0~65535(0000000000000000B~1111111111111111B)
有符号整数的表示
字长为n位的计算机,它能表示的有符号整数的范围是-2^n-1^~2^n-1^-1
最高位表示符号,0表示正号(+),1表示负号(-),其余用来表示数值部分。
数值部分的表示方法
-
原码表示
整数的绝对值以二进制自然码表示
如字长为8位的计算机中,[ +20 ]~原~=00010100 [ -20 ]~原~=10010100
字长为n位的计算机,能表示的有符号整数的范围是-2^n-1^~2^n-1^-1
字长为8位的计算机,有符号整数的范围是:-127~+127(10000000B~01111111B)
字长为16位的计算机,有符号整数的范围是:-32767~+32767.
-
补码表示
正整数的绝对值以二进制自然码表示,负整数的绝对值使用补码表示
[ +20 ]~补~=00010100 [ -20 ]~补~=11101011
定点小数
定点小数是纯小数,是指在计算机内部中固定小数点位置在符号位与有效数值部分之间。
所有数绝对值均小于1
浮点数
所谓浮点数是指小数点位置不固定的值。定点数表示的数在实际应用中是不够用的,尤其在科学计算中。为了能表示非常大或非常小的数,采用浮点数表示。
浮点数主要由符号位(正负)、阶码和尾数(有效数字)这三个部分组成:
- 符号位:用来表示数值的正负,通常是最高位的数码,0表示正数,1表示负数
- 阶码(指数):用定点整数来表示,存储实际指数值,阶码所占的位数确定了数的范围
- 尾数:用定点小数表示,存储小数部分的有效数字。尾数所占的位数确定了数的精度
如:-0.2368*10^+3^,其中-是符号位,0.2369是尾数,+3是阶码(尾数)
浮点数的表示方法和科学计数法相似,任意一个数均可通过改变其指数部分,使小数点发生移动,如十进制数23.89可以表示为2.368x10^1^、0.2368x10^2^、0.02368x10^3^等。
在计算机中,浮点数的一般表示形式为N=2^E^xD,其中,D称为尾数,E称为阶码。
BCD编码
BCD(Binary-Coded Decimal,二进制编码的十进制)是一种将十进制数以二进制形式编码的方法,它确保每一位二进制编码仅能表示0到9之间的单个十进制数字。
当十进制小数转换为二进制数时会产生误差,为了精确地存储和运算十进制数,可用若干位二进制数码来表示一位十进制数,称为二进制编码的十进制数。
BCD编码的主要目的是为了简化计算机系统中十进制数据的处理,尤其是对于那些需要精确十进制表示的应用场景,比如金融和会计系统
在BCD编码中,一个十进制位通常用4位二进制来表示,因为2的4次方等于16,而10进制数正好在0到9这个范围内。BCD码可分为8421码(从高位到低位的权值分别为8、4、2、1)、2421码(从高位到低位的权值分别为2、4、2、1)、5421码(从高位到低位的权值分别为5、4、2、1)等。8421最基本的,最常用的BCD码。
8421该怎么计算?
示例:用8421法将十进制5转换为二进制数
按照8421来分解5:5=4+1
用8421转换法,对应数字的下面写1,没有的写0,得到:
所以:5D=0101B
常用BCD码与十进制数的对应关系如表1-11所示
十进制数 | 8421码 | 5421码 | 2421码 |
---|---|---|---|
0 | 0000 | 0000 | 0000 |
1 | 0001 | 0001 | 0001 |
2 | 0010 | 0010 | 0010 |
3 | 0011 | 0011 | 0011 |
4 | 0100 | 0100 | 0100 |
5 | 0101 | 1000 | 1011 |
6 | 0110 | 1001 | 1100 |
7 | 0111 | 1010 | 1101 |
8 | 1000 | 1011 | 1110 |
9 | 1001 | 1100 | 1111 |
如果要表示更大的十进制数,只需将每个十进制位转换为相应的BCD码,并按顺序排列起来。例如,十进制数123可以表示为:
- 十进制数 1 对应的 BCD 码是:0001
- 十进制数 2 对应的 BCD 码是:0010
- 十进制数 3 对应的 BCD 码是:0011
所以,十进制数123的BCD编码就是:0001 0010 0011。
使用BCD编码的优点在于可以直接读取并理解其表示的十进制数值,避免了二进制与十进制之间转换时可能引入的精度损失。然而,相对于原生二进制表示,BCD编码占用的空间较大。