在计算机中参与运算的数有两大类:无符号数和有符号数。
1.无符号数
定义为:不带符号位的整数(unsigned integer,也称为无符号整数),此类整数可以表示0和正整数;带符号位的整数(signed integer),此类整数可以表示正整数,又可以表示负整数。 无符号整数常用于表示地址、索引等正整数,它们可以是8位、16位、32位、64位甚至更多。
2.有符号数
对于符号数而言,符号的“正负”机器是没有办法进行识别的,但“正负:两种符号恰好是两种不同的状态,如果用”0“表示正,用”1“表示负,这样符号也被数字化了,并且规定将它们放到有效数字的前面,及组成了符号位。
如:
小数的情况下
+0.1011 它在机器中就可以表示为
0(符号位,代表”负“号) | 小数点的位置 | 1011(有效数字位) |
-0.1011,在机器中表示为:
1(符号位,代表在”正“号) | 小数点的位置 | 1011(有效数字位) |
当数为整数的情况下:
+1100,在机器中表示为:
0(符号位,代表”正“号) | 1100(有效数字位) | (小数点位置) |
-11001在机器中表示:
1符号位,代表”负“号) | 1100(有效数字位) | (小数点位置) |
规定把符号”数字化“的的数称为机器数,把带”+”,“-”的数成为真值。
符号数字化的运算:
有以下几种,原码,反码,补码和移码。
原码:
原码 (true form)是一种计算机中对数字的二进制定点表示方法。 原码表示法在数值前面增加了一位符号位(即最高位为符号位):正数该位为0,负数该位为1(0有两种表示:+0和-0),其余位表示数值的大小。
原码分为整数原码和小数原码
整数原码的定义为:
其中,x为真值,n为整数的位数。
例如:
当x=+1110时,[x]原=0,1110
当x=-1110时,[x]原=2^4-(-1110)=1,1110
都好的作用是将符号位与数值部分分开。
小数的原码定义为:
例如:
当x=0.1101时,[x]原=0.1101
当x=-0.1101时,[x]原=1-(-0.1101)=1.1101
反码:
反码就是原码到补码之间的一个过渡码,当原码为正时,他的反码和原码相同。当原码为负时,他的反码可以这样计算:符号为不变,其它各位取反所得到的。
例如:
当x=+1101时
[x]反=0,1101
当x=-1101时
[x]反=1,0010
它的定义如下:
整数的反码定义为:
x为真值,n为整数的位数
小数反码的定义为:
补码:
利用原码可以求补码,先求出原码的的反码,再对反码的末尾加1。补码分为整数补码和小数补码。
整数补码的定义:
例如:
当x=+1010时,
[x]补=0,1010
当x=-1101时,
[x]补=2^(n+1)+x=100000-1101=1,0011
小数补码的定义:
例如:
当x=0.1101时,
[x]补=0.1001
当x=-0.0110时,
[x]补=2+x=10.0000-0.01100=1.1010
注意:
当x=0时,
[+0.0000]补=0.0000
[-0.0000]补=2+(-0.0000)=10.0000-0.0000=0.0000
显然,[+0]补=[-0]补
移码:
当真值用补码表示时,由于符号位与数值部分一起编码,与习惯上的表示不同,人们很难从补码的形式下直接判断其真值的大小。于是就定义了移码。
移码的定义为:
[x]移=2^n+x(2^n>x>=-2^n)
例如:x=10100
[x]移=2^5+10100=1,10100
用逗号将符号位与数值部分分开
x=-10100
[x]移=2^5-10100=0,01100
当x=0时
[+0]=2^5+0=1,00000
[-0]=2^5-0=1,00000
即移码中的0是唯一的‘
其实,我们可以发现,同一个真值的移码和补码仅差一个符号位,若将补码的符号位由“0”改为“1”,或从“1”改为“0”,即可得该真值的移码。
真值,补码和移码的对照表:
结论:
当真值为正时,原码,补码和反码的表示形式均相同,即符号位用“0”表示,数值部分与真值 相同。
当真值为负时,原码,补码和反码的表示形式不同,但其符号位都用“1”表示,而数值部分有这样的关系,即补码时原码的“求反加1”,反码是原码的“每位求反”。