有符号数在计算机内部是以二进制补码形式存储的,其最高位为符号位,"0"表示正数,"1"表示负数。无符号数只能是正数,在计算机内是以绝对值形式存放的
在计算机内部,各种信息都是以二进制编码形式存储的,信息存储的单位通常采用:”位”,”字节”,”字”。
位(bit):度量数据的最小单位,表示一位二进制信息。
字节(byte):一个字节由8位二进制数字组成(1byte = 8 bit)。
字(word):字是位的组合,并作为一个独立的信息单位处理。字又称之为计算机字,它的含义取决于机器的类型,字长以及使用者的要求。常用的固定字长有8位,16位,32位等。
机器字长:机器字长是与机器硬件指标有关的单位。机器字长一般是指参与运算的寄存器所含有的二进制数的位数,代表了机器的精度。
一个数在机内的表达形式称为”机器数”,而它代表的数值称为此机器数的”真值”。
虽然信息在计算机内部是以二进制形式存储,但是数值信息分为有符号和无符号,数值信息的有无符号在存储上可以直接通过0,1来区分,但是运算时比较麻烦,为了改进符号数的运算方法和简化运算器的硬件结构,人民研究了符号数的多种二进制编码方法,其实质就是对负数表示的不同编码。现在最常用的编码就是原码,反码和补码
1原码
将符号位数字化为0或1,数的绝对值与符号一起编码,即所谓的”符号-绝对值表示”的编码,称为:原码。
X = +0101011 [X]原= 00101011
X = - 0101011 [X]原=10101011
上面的”[X]原”就是机器数,X称为机器数的真值。
那么对于一个带符号的纯小数,它的原码表示就是把小数点左边一位用作符号位。例如:
X = 0.1011 [X]原 = 0.1011
X =-0.1011 [X]原 =1.1011
当采用原码表示时,编码简单直观,但在原码表示中,零的表示不唯一,因为:
[+0]原 = 000……0 [-0]原 = 100……0
上面的零表示不同,即存在二义性,给机器判零带来麻烦。此外,用原码进行四则运算时,符号位需要单独处理,其运算规则复杂,且,借位操作如果用计算机硬件来实现,则存在一定的难度。正是因为原码的不足之处,使得更好的方法得以诞生。由此产生了现在常用的补码,但是在补码和原码之间存在一种反码的编码方式:
正数的反码与原码表示相同
负数的反码与原码的关系如下:负数反码的符号位与原码相同(仍用1表示),其余各位取反(0变1,1变0)。
X=-1100110 [X]原 =11100110 [X]反= 10011001
那么和原码一样,反码中零的表示也不唯一
当X为纯小数时,反码表示如下:
X = 0.1011 [X]原 = 0.1011 [X]反 = 0.1011
X = - 0.1011 [X]原 = 1.1011 [X]反 = 1.0100
下面来介绍补码:
在此之前先来了解一下模数的概念:模式从物理意义上来讲,是某种计量器的容量。例如钟表,模数就是12,钟表计时的方式是达到12就从0开始(扔掉一个12),这在数学上是一种”取模(或取余)运算(mod)”。 “%”是编程语言中求除法余数的运算符。例:14 % 12 = 2
如果此时的正确时间为6点,而你的手表指向的是8点,如何把表调准呢?有两种方法:一把表逆时针拨两个小时;二是把表顺时针拨10个小时,即
8-2=6
(8+10)%12=6
也就是说在此模数系统里面有
8-2=8+10
这是因为2跟10对模数12互为补数。因此有一下结论:在模数系统中,A-B或A+(-B)等价于A+[B补],即
8-2/8+(-2)=8+10
我们把10叫做-2在模12下的补码。这样用补码来表示负数就可以将加减法统一成加法来运算,简化了运算的复杂程度。
采用补码进行运算有两个好处,一个就是刚才所说的统一加减法;二就是可以让符号位作为数值直接参加运算,而最后仍然可以得到正确的结果符号,符号位无需再单独处理。
如果有N位整数(包括一位符号位),则它的模数为2的N次幂。n位计算机,设n=8,所能表示的最大数是11111111,若再加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的模为2^8。
如果有N位纯小数,小数点前一位为符号位,则它的模数为2,(注意模数表示的是容量, 这里的模数为2 表示 -1 到1的容量)
补码的特点之一就是零的表示唯一:
需要注意的是:补码的结果仍为补码,可对补码符号位不变,其余位取反加1即可得其原码