在进位计数法中(以十进制为例),每个数位所用到的数码(0-9)的个数称为基数(10),每个数位记满基数后就向高位进位。
每个数码所表示的数值等于该数码本身乘以一个与它所在数位有关的常数,这个常数称为位权
一个进位数的数值大小就是它的各位数码按权相加:
9527=9×103+5×102+2×101+7×1009527=9\times 10^3+5\times10^2+2\times10^1+7\times10^09527=9×103+5×102+2×101+7×100
在计算机系统内部,所有信息都使用二进制进行编码,这样做的原因如下:
952710=1001010011011129527_{10}=10 0101 0011 0111_{2}952710=100101001101112
通常会使用八进制和十六进制方便的表示二进制数:
952710=100101001101112=224678=2537169527_{10}=10 0101 0011 0111_{2}=22467_{8}=2537_{16}952710=100101001101112=224678=253716
对于一个二进制混合数(既包含整数部分又包含小数部分),在转换时应以小数点为界,整数部分,从小数点开始往左数,将一串二进制分为3位(八进制)一组或四位(十六进制)一组,在数的最左边可根据需要加0补齐;小数部分,从小数点开始往右数,也将一串二进制分为3位(八进制)一组或四位(十六进制)一组,在数的最右边可根据需要加0补齐,最终使总的位数为3或4的整数倍,然后分别用对应的八进制数或十六进制数取代。
100101001101112⇓0010010100110111⇓25371610 0101 00110111_{2}\\\Downarrow\\0010\quad0101\quad0011\quad0111\\\Downarrow\\2537_{16}100101001101112⇓0010010100110111⇓253716
将任意进制数的各位数码和它们的权值相乘,再把乘积相加,就得到了一个十进制数,这种方法称为按权展开相加法。
253716⇓2×163+5×162×3×161+7×160⇓9527102537_{16}\\\Downarrow\\2\times16^3+5\times16^2\times3\times16^1+7\times16^0\\\Downarrow\\9527_{10}253716⇓2×163+5×162×3×161+7×160⇓952710
对十进制数的整数部分采用除基取余法:整数部分除基取余,最先取得的余数为数的最低位,最后取得的余数为数的最高位,商为0时结束;对十进制的小数部分采用乘基取整法,小数部分乘基取整,最先取得的整数为数的最高位,最后取得的整数为数的最低为,乘积为1(或满足精度,因为在计算机中,整数可以连续表示,而小数是离散的)时结束。
日常生活中,通常使用正负号表示正数和负数,这种带正负符号的数就称为真值。在计算机中,通常将数的符号和数值部分一起编码,将数值的符号数字化,用0
表示正号,1
表示负号。这种将符号数字化的数称为机器数,机器数所表示的实际值就是真值。在计算机中,根据小数点的位置是否固定将机器数分为定点数和浮点数,并且常使用原码、补码、反码和移码表示法来表示机器数。
定点表示法用于表示定点小数和定线整数。
原码表示法:用机器数的最高位表示数的符号,其余各位表示数的绝对值。
注:下文在不说明的情况下均以字长为4示例
):原码表示法的优点是与真值的相互转换简单;缺点是0的表示不唯一并且符号位不能参与运算。
在介绍补码之前,先了解几个概念和性质:
在一个具有模的计量系统中,只需要找到负数的一个正数同余数,就可以将所有减法运算转换为加法运算。在计算机中,由于计算机的字长是固定的,所以可以将计算机看作一个模为242^424的计量系统。那么就可以使用同余数进行编码,这就编码方式就称为补码表示法。补码中符号位即代表了数的正确符号,又表示同余数中的一个数位,因此在补码运算中,符号位可以与数值位一起参加运算。纯小数的补码定义如下:
[x]补={x,0≤x<12+x,−1≤x≤0(mod2)[x]_补=\begin{cases}x,\ \ 0≤x<1\\2+x,\ \ -1≤x≤0\end{cases}(mod\ \ 2)[x]补={x, 0≤x<12+x, −1≤x≤0(mod 2)
纯整数的补码定义如下:
[x]补={x,0≤x≤23−124+x,−23≤x≤0(mod24)[x]_补=\begin{cases}x,\ \ 0≤x\leq2^3-1\\2^4+x,\ \ -2^3≤x≤0\end{cases}(mod\ \ 2^4)[x]补={x, 0≤x≤23−124+x, −23≤x≤0(mod 24)
相较于原码表示法,补码表示法0的表示唯一、加减运算统一采用加法操作实现并且负数的表示范围增加。
反码表示法:正数的反码还是等于原码;负数的反码就是它的原码除符号位外,按位取反。通常使用来由原码求补码或者由补码求原码的过渡码。
移码表示法:在真值上加上一个常数(偏置值),通常这个常数为232^323,相当于xxx在数轴上向正方向移动了若干个单位。通常使用移码表示浮点数的阶码,它只能表示整数。
[x]移=23+x,−(23−1)≤x≤23−1[x]_移=2^3+x,\ \ -(2^3-1)\leq x\leq2^3-1[x]移=23+x, −(23−1)≤x≤23−1
浮点数表示法是指以适当的形式将比例因子表示在数据中,让小数点的位置根据需要而浮动。这样,在数位有限的情况下,既扩大了数的表示范围,又保持了数的有效精度。
浮点数的格式表示为:
N=(−1)S×M×REN=(-1)^S\times M\times R^EN=(−1)S×M×RE
其中:
浮点数的范围是关于原点对称的:
上溢:
下溢:
数据产生上溢,计算机必须中断运算操作,进行溢出处理;数据产生下溢,浮点数值趋于0,计算机将其当作机器数0处理。
现代计算机使用不同的编码表示不同性质的数:
原码:
补码:
原码:
补码:
将被减数与减数的机器负数的补码相加。
按照二进制运算规则,逢二进一。
符号位参与运算,两数直接相加,结果的符号位也在运算中得出。
溢出位丢弃,最终结果也为补码。
移位运算具体包括以下几种运算:
原码:
反码:
补码:
现代计算机基本上采用字节编址,即每个地址编号对应1字节内存,不同类型的数据占用的字节数不同,而程序中每个数据只给定一个地址,那这个地址是是哪个地址呢?
多字节数据存放在连续的内存中,用最高有效字节(LSB)和最低有效字节(MSB)来表示数据的低位和高位。根据数据字节在内存中存放的顺序不同,可以采取以下两种存储方式:
边界对齐是指当存储的数据长度不够半字或字长度时,通过添加空白字节使其满足长度的存储方式。而非边界对齐是指充分利用每一个字节,不留空白的存储方式。假设现有一台32位可按字节、半字和字寻址的计算机,一个长度为3B的数据D,如果数据以边界对齐的方式存放,那么这个数据可以通过一次字寻址就全部取出。
但如果使用非边界对齐的方式存放,恰巧这个数据有1B存储到了第一个字,有2B存储到了第二个字,那么无论采用哪种寻址方式都不能通过一次寻址就把这个数据全部取出。此时需要进行两次寻址,并且对高低字节的位置进行调整、连接之后才能得到想要的数据,从而影响了指令的执行效率。