计算机中数的表示可以进行如下分类:
定点数又可以分为:
unsigned
):表示范围为 对于n位二进制数,则其表示范围为
基本概念:
尽管当前计算机中实际使用的为补码,但是我们先从原码讲起。
将二进制数最高位当成符号位,正数为 0
、负数为 1
,其余位数为数值的表示形式即为符号数的原码表示,例如:
则其特性为:
存在的缺陷:
对于正数,其反码与原码相同;而对于负数,其二进制表示是其对应正数的反码表示,例如:
则其特性为:
补码是当前计算机使用的符号数表示方法。
其核心思想是找一个"无符号正数",使得其加减运算性质和这个"有符号负数"一致。具体规定如下:
则其特性为:
则其优点为:
存在的缺陷有:
如上文所述,使用补码原则可保持符号数的加减运算直接按照二进制进行运算,具体举例如下:
OF=1
,为下一章内容),-64-68
,其结果为:1100 0000
+ 1011 1100
= 0111 1100
= 124
移码在补码的基础上,将补码的符号位取反,其优点是解决了负数机器数大于正数机器数的问题:
真值 | 补码 | 补码机器数 | 移码 | 移码机器数 |
---|---|---|---|---|
-128 | 1000 0000 |
128 | 0000 0000 |
0 |
-127 | 1000 0001 |
129 | 0000 0001 |
1 |
... | ... | ... | ... | ... |
-1 | 1111 1111 |
256 | 0111 1111 |
127 |
0 | 0000 0000 |
0 | 1000 0000 |
128 |
1 | 0000 0001 |
1 | 1000 0001 |
129 |
... | ... | ... | ... | ... |
126 | 0111 1110 |
126 | 1111 1110 |
255 |
127 | 0111 1111 |
127 | 1111 1111 |
256 |
则其特性为:
移码的另一种理解方式:
一般来说,浮点数的表示格式为:
浮点数的表示范围:
讨论两种情况:
304258614721
,并规定尾数占4位,阶数占2位,则该数字可以被如下的几种方式表示:
而在二进制表示中,有效位一定为 1
,因此通常将该位内存省略(如IEEE 754)。
现在常用的浮点数标准为IEEE 754,在该规范中,上述浮点数格式为:
总位数 | 符号位 | 阶数 | 尾数 | 隐含基数 | |
---|---|---|---|---|---|
短浮点数( float ) |
32 | 1 | 8 | 23 | 2 |
长浮点数( double ) |
64 | 1 | 11 | 52 | 2 |
临时浮点数( long double ) |
80 | 1 | 15 | 64 | 2 |
其中:
1.
。本章节以 float
为例。
首先需要注意,IEEE 754已经隐含了浮点数的规格化:
1
1
后面,即默认携带了 1.
前缀1.
后使用原码规则进行计算即可。在阶码规范中预留了两个特殊表示,其对应的定义和用途如下:
0
,且:
0
时,表示真值 0
时,表示非格式化数,其依旧有具体的数值含义,此时取消尾数的 1.
前缀进行数值计算即可得到其所表达的数值,用于补充规格化所带来的小值的表示域缩小,可以用于平滑计算等。1
,且:
0
时,表示真值 0
时,表示非数值 NaN
(Not a Number)。在判定特殊表示后,按照下式转换即可:
浮点数加减运算的步骤:
对于二进制来说,通常要增加一个格式转换的过程。例如:
已知:
, ,进行二进制浮点运算 。假设浮点数格式为阶符2位、阶数3位、数符2位、尾数9位。
则有:
BCD码就是用四位二进制表示一位十进制,且浪费6个字符空间,如下图所示:
即对于任意n位十进制数,均需要4n位二进制表示,例如压缩BCD码:
而BCD码可以分为压缩BCD码和非压缩BCD码两种:
就注意需要对非法BCD码进行进位即可,例如
字符编码即经典ASCII编码。需要注意的有:
' '
将字符括起来可以表示该字符的二进制值,例如:'A' = 41H
'5C' = 3543H // 注意扩两个字符则是2Byte,且C语言支持扩多个字符
1
的数量为奇数个。1
的数量为偶数个。