原码、反码、补码 定点数 浮点数什么意思?有什么用?
  数据在计算机中采用二进制后,用高电平和低电平分别表示01,正好用0,负号用1.
假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为:
00000000 00000000 00000000 00000101
5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0
现在想知道,-5在计算机中如何表示?
在计算机中,负数以其正值的补码形式表达。
什么叫补码呢?这得从原码,反码说起。
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如 00000000 00000000 00000000 00000101 5 原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作指:原为1,得0;原为0,得1。(10; 01)
比如:将00000000 00000000 00000000 00000101每一位取反,得11111111 11111111 11111111 11111010
称:11111111 11111111 11111111 11111010 00000000 00000000 00000000 00000101 的反码。
反码是相互的,所以也可称:
11111111 11111111 11111111 11111010 00000000 00000000 00000000 00000101 互为反码。
补码:反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如:00000000 00000000 00000000 00000101 的反码是:11111111 11111111 11111111 11111010
那么,补码为:
11111111 11111111 11111111 11111010 1 = 11111111 11111111 11111111 11111011
所以,-5 在计算机中表达为:11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB
 
再举一例,我们来看整数-1在计算机中如何表示。
假设这也是一个int类型,那么:
1、先取1的原码:00000000 00000000 00000000 00000001
2、得反码: 11111111 11111111 11111111 11111110
3、得补码: 11111111 11111111 11111111 11111111
正数的原码,补码,反码都相同,都等于它本身
负数的补码是:符号位为1,其余各位求反,末位加1
反码是:符号位为1,其余各位求反,但末位不加1
也就是说,反码末位加上1就是补码
1100110011
1011001100 除符号位,按位取反
1011001101 除符号位,按位取反再加1
正数的原反补是一样的
在计算机中,数据是以补码的形式存储的:
n位的机器数中,最高位为符号位,该位为零表示为正,为1表示为负;
其余n-1位为数值位,各位的值可为01
当真值为正时:原码、反码、补码数值位完全相同;
当真值为负时:
原码的数值位保持原样, 反码的数值位是原码数值位的各位取反,
补码则是反码的最低位加一。
注意符号位不变。
:若机器数是16:
十进制数 17 的原码、反码与补码均为: 0000000000010001
十进制数-17 的原码、反码与补码分别为:1000000000010001111111*********0111111*********1
定点数与浮点数
1、定点数:
定点数指小数点在数中的位置是固定不变的,通常有定点整数和定点小数。在对小数点位
置作出选择之后,运算中的所有数均应统一为定点整数或定点小数,在运算中不再考虑小数问题。
1)定义:数据中小数点位置固定不变的数
2)种类:定点整数
3)小数点在符号位与有效位之间。
注:定点数受字长的限制,超出范围会有溢出。
2、浮点数:
浮点数中小数点的位置是不固定的,用阶码和尾数来表示。通常尾数为纯小数,阶码为整数,尾数和阶码均为带符号数。尾数的符号表示数的正负;阶码的符号则表明小数点的实际位置。
1)形式:N=M×2E
2)M:尾数
3)E:阶码
4)在计算机中M和E表示形式为
阶码 尾数符号 尾数
将其与数学中的科学记数法进行比较。
注:其浮点数的精度由尾数决定,数的表示范围由阶码决定。
3、定点数与浮点数区别
定点表示法运算直观,但数的表示范围较小,不同的数运算时要考虑比例因子的选取,以防止溢出。浮点表示法运算时可以不考虑溢出,但浮点运算,编程较难。要掌握定、浮点数的转换方法及浮点数规格化方法。
浮点数表示 补码表示
一个浮点数a由两个数m和e来表示:a = m × b^e。在任意一个这样的系统中,我们选择一
个基数b(记数系统的基)和精度p(即使用多少位来存储)。m(即尾数)是形如±ddd的p位数(每一位是一个介于0到b-1之间的整数,包括0和b-1)。如果m的第一位是非0整数,m称作规格化的。有一些描述使用一个单独的符号位(s 代表+或者-)来表示正负,这样m必须是正的。
当尾数用二进制数表示时,浮点规格化数定义尾数S应满足下面关系:
(I)对于正数,S应大于等于1/2,小于1,用二进制数表示为:
S=0.1******…(其中*为0或1)
(II)对于负数,如果尾数用原码表示,S应小于等于-1/2,大于-1,表示为:
S=1.1******…(其中*为0或1)
m称作尾数,用原码表示
e称作阶数,用补码表示
现在一般使用的浮点表示方法是美国电气电子工程师学会标准IEEE 754-1985
-----------------------------------
有符号数有三种表示:原码(最高位0表示正数,1表示负数)、反码、补码。
8位有符号数表示范围是:
原码:-127~+127
反码:-127~+127浮点数的基数什么意思
补码:-128~+127
所以8位表示时,-128没有原码表示,只有补码表示,为10000000 (此数并非表示算出来的-0的补码,而是人为规定为-1288位补码,并规定0只有一个补码00000000,原码时10000000表示-0)
8位无符号数就可以表示0~255。
计算机采用补码是为了有符号数中0的表示的唯一性(正负0原码不同),并且可以把减法转换成加法来运算:a+(-b)=[a-b],再对[a-b]补求一个补就得到a-b的值.
------------------------------------------
原码就是这个数本身的二进制形式。
例如
0000001 就是+1
1000001 就是-1
正数的反码和补码都是和原码相同。
负数的反码是将其原码除符号位之外的各位求反
[-3]反=[10000011]反=11111100
负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。
[-3]补=[10000011]补=11111101
一个数和它的补码是可逆的(再对补码求补得到原码)
为什么要设立补码呢?
第一是为了能让计算机执行减法:
[a-b]补=a补+(-b)补
第二个原因是为了统一正0和负0
正零:00000000
负零:10000000
这两个数其实都是0,但他们的原码却有不同的表示。
但是他们的补码是一样的,都是00000000
特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)
[10000000]补
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符号位变成了0
有人会问
10000000这个补码表示的哪个数的补码呢?
其实这是一个规定,这个数表示的是-128(注意,对补码10000000-128)再求补并不能得到-128的原码(8位原码只能表示到-127))
所以n位补码能表示的范围是
-2^(n-1)到2^(n-1)-1
比n位原码能表示的数多一个
又例:
1011
原码:01011
反码:01011 //正数时,反码=原码
补码:01011 //正数时,补码=原码
-1011
原码:11011
反码:10100 //负数时,反码为原码取反
补码:10101 //负数时,补码为原码取反+1
01101
原码:0.1101
反码:0.1101 //正数时,反码=原码
补码:0.1101 //正数时,补码=原码
-01101
原码:1.1101
反码:1.0010 //负数时,反码为原码取反
补码:1.0011 //负数时,补码为原码取反+1
总结:
在计算机内,定点数有3种表示法:原码、反码和补码
所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。
反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位
除外。
补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1(如果+1之后有进位的,要一直往前进位,包括符号位)。