在各种大学教材,各种网站论坛中,对于整数编码表示方法的正确打开姿势(姿势要帅)如下:
1、机器数
机器数(computer number)是数字在计算机中的二进制表示形式。机器数有2个特点:
①、符号数字化。因为计算机硬件只认识两种物理状态(用0和1表示),因此数据的正负号在机器里就用一位二进制0或者1来区分。在计算机用一个数的最高位存放符号, 0代表符号“+”,以1代表符号“-”。
②、机器数的大小受机器字长的限制。机器内部设备一次能表示的二进制位数叫机器的字长,一台机器的字长是固定的。字长8位叫一个字节(Byte),机器字长一般都是字节的整数倍,如字长8位、16位、32位、64位。
比如在字长为8的计算机中,十进制数+5,其机器数为00000101;十进制数-5,其机器数为10000101。
2、真值
计算机机器数真正的值称为真值。因为机器数的最高位是符号位,所以我们在计算真值的时候要分区分开。
比如上面讲的机器数10000101,单纯作为一个二进制数,我们转换为十进制是133。但是其真值是不计算符号位的,其最高位的1表示"-"。所以10000101的真值为-5。
3、机器数的原码、反码、补码三种形式
前面我们讲过机器数是在计算机中的二进制表示形式,但是在计算机中,这种表现形式又分为原码、反码、补码等三种最常用的形式。
ps:下面举例都是字长为8。
①、原码
比如:
[+5]原码=0 0000101
[-5]原码=1 0000101
原码表示与真值对应直观,而且转换也简单。但是用原码进行加减运算的时候,会出现以下问题:
注意:计算机是没有减法器,只有加法器,减法运算可以转换为加上那个数的负数。
我们发现通过原码计算1 - 1 表达式结果居然是 -2。所以早期计算机机器数采用原码编码的时候,在进行原码加减运算时,必须先判定是否是两个异号数相加或两个同号数相减,若是,则必须判定两个数的绝对值大小,根据判断结果决定运算结果符号,并用绝对值大的数减去绝对值小的数。也就是说用这样一种形式进行加运算时,负数的符号位不能与其数值部分一道参加运算,而必须利用单独的线路确定符号位。很显然,这样设计电路就很复杂,这是不经济实用的,为了解决这个问题,反码产生了。
②、反码
我们用反码来计算 1 - 1
看上去结果好像是正确的了,但是大家发现没,结果是-0,虽然对于0的符号没有什么实际意义。但是在计算机中,0如果用原码和反码表示会有两种形式:
两种编码就两种编码吧,只不过是多占用一个计算机表示数的编码形式。只要结果是正确的,我们还是能够忍受的,然而。。。。
请用反码计算表达式 2 -1
是不是很奇怪,原码计算 2 - 1 得到的结果居然是 0 。其实稍微分析计算过程我们也知道,再用反码进行加法运算的时候发生了进位,而由于字长为8,进位就直接省略了,便造成了错误。这肯定是不被允许的,所以采用反码的计算机解决办法如下:
反码的符号位相加后,如果有进位出现,则要把它送回到最低位去相加(循环进位)。
采用反码运算虽然较好的解决了原码运算所遇到的困难或问题,但由于循环进位需要二次算术相加,延长了计算时间,这同样给电路带来麻烦。这时候补码登场了。
③、补码
我们来看下面这个例子:
2 - 1 = 1
9 + 12 = 21