软考中级-软件设计师-笔记-数据表示
各种数值在计算机中表示的形式称为机器数。采用二进制计数值。数的符号用0和1表示。0代表正数,1代表复数。小数点隐含不占位置。
机器数有无符号和带符号之分。无符号表示正数,机器数中没有符号位。小数点在最低位之后表示纯整数。在最高位之前表示纯小数。带符号数,机器数最高位表示正、负符号位,其余位表示数值。
带符号机器数可采用原码、反码和补码等不同编码方法。机器数的编码方法称为码制。
原码
原码表示法。
数值$ X $的原码记为$ [X]_{原} $,如果机器的字长为$ n $(采用$ n $个二进制位表示数据),原码定义如下:
若$ X $为纯整数,则:
$$ [X]_{原} =\left\{\begin{matrix} X & 0\le X \le 2^{n-1} -1\\ 2^{n-1}+|X| & -(2^{n-1} -1) \le X \le 0\end{matrix}\right. $$
若$ X $为纯小数,则:
$$ [X]_{原} =\left\{\begin{matrix} X & 0\le X \le 1\\ 2^{0}+|X| & -1 \le X \le 0\end{matrix}\right. $$
假设$ n=8 $,有8个二进制位表示数据。第一位是符号位,0为正,1为负。后面表示数据。
如果是纯整数,小数点在最后。纯小数的话,小数点在符号位之后数据位之前。
例子:给出+1,-1,+127,-127,+45,-45,+0.5,-0.5的原码表示:
$$ [+1]_{原} =00000001 $$
$$ [-1]_{原} =10000001 $$
$$ [+127]_{原} =01111111 $$
$$ [-127]_{原} =11111111 $$
$$ [+45]_{原} =00101101 $$
$$ [-45]_{原} =10101101 $$
$$ [+0.5]_{原} =01000000 $$
$$ [-0.5]_{原} =11000000 $$
反码
反码表示法。
公式就没必要写了。正数的话和原码一样。负数的话,原码所有位取反(除了符号位)。
假设$ n=8 $,给出+1,-1,+127,-127,+45,-45,+0.5,-0.5的反码表示:
$$ [+1]_{原} =00000001 $$
$$ [-1]_{原} =11111110 $$
$$ [+127]_{原} =01111111 $$
$$ [-127]_{原} =10000000 $$
$$ [+45]_{原} =00101101 $$
$$ [-45]_{原} =11010010 $$
$$ [+0.5]_{原} =01000000 $$
$$ [-0.5]_{原} =10111111 $$
补码
补码表示法。
正数和原码表示法一样,负数是反码表示法+1(除了符号位)。
假设$ n=8 $,给出+1,-1,+127,-127,+45,-45,+0.5,-0.5的补码表示:
$$ [+1]_{原} =00000001 $$
$$ [-1]_{原} =11111111 $$
$$ [+127]_{原} =01111111 $$
$$ [-127]_{原} =10000001 $$
$$ [+45]_{原} =00101101 $$
$$ [-45]_{原} =11010011 $$
$$ [+0.5]_{原} =01000000 $$
$$ [-0.5]_{原} =11000000 $$
移码
移码表示法。
移码表示法是在数$ X $上增加一共偏移量定义。常常用于表示浮点数中的阶码。这里规定的偏移量有不同的方案,比如IEEE754标准规定浮点数中指数域编码值的偏移量$ 2^{n-1}-1 $。
假设$ n=8 $,偏移量$ 2^{n-1}$,给出+1,-1,+127,-127,+45,-45,+0,-0的补码表示:
$$ [+1]_{原} =10000001 $$
$$ [-1]_{原} =01111111 $$
$$ [+127]_{原} =11111111 $$
$$ [-127]_{原} =00000001 $$
$$ [+45]_{原} =10101101 $$
$$ [-45]_{原} =01010011 $$
$$ [+0]_{原} =10000000 $$
$$ [-0]_{原} =10000000 $$
在偏移$ 2^{n-1} $情况下,只要将补码符号位取反就可以获得移码表示。
二进制,十进制和十六进制转化
这里写一个我习惯的方法。
假设$ n=8 $,各个位对应的数据如下
二进制 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
十进制 | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 |
十六进制 | 0~F | 0~F |
先说二进制和十进制的转换。
每个二进制位对应一个十进制数。
假设写出数字45的二进制数。
先将数字拆解,由表里的十进制数相加的形式。
因为$ 45=32+8+4+1 $
对应二进制位取1,其余位取0。
所以45的二进制形式为——00101101。
和十六进制的转换。
每四个二进制位对应一个十六进制位。四位四位分开。
假设写出45的十六进制形式。
45的二进制形式0010 1101,四位四位分开。
前四位对应十进制是数字2
后四位对应十进制是数字13
分别转换十六进制,2是2,13是D
所以45的十六进制形式为——0x2D。
我习惯写这样一个表,二进制十进制十六进制相互转换一目了然。