原码、反码、补码 定点数 浮点数什么

原码、反码、补码 定点数 浮点数什么


2024年1月10日发(作者:)

原码、反码、补码 定点数 浮点数什么意思?有什么用?

数据在计算机中采用二进制后,用高电平和低电平分别表示0和1,正好用0,负号用1.

假设有一 int 类型的数,值为5,那么,我们知道它在计算机中表示为:

00000000 00000000 00000000 00000101

5转换成二制是101,不过int类型的数占用4字节(32位),所以前面填了一堆0。

现在想知道,-5在计算机中如何表示?

在计算机中,负数以其正值的补码形式表达。

什么叫补码呢?这得从原码,反码说起。

原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。

比如 00000000 00000000 00000000 00000101 是 5的 原码。

反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。

取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)

比如:将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位为数值位,各位的值可为0或1。

当真值为正时:原码、反码、补码数值位完全相同;

当真值为负时:

原码的数值位保持原样, 反码的数值位是原码数值位的各位取反,

补码则是反码的最低位加一。

注意符号位不变。

如:若机器数是16位:

十进制数 17 的原码、反码与补码均为: 0001

十进制数-17 的原码、反码与补码分别为:1001、01110、01111

定点数与浮点数

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的补码,而是人为规定为-128的8位补码,并规定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

0.1101

原码:0.1101

反码:0.1101 //正数时,反码=原码

补码:0.1101 //正数时,补码=原码

-0.1101

原码:1.1101

反码:1.0010 //负数时,反码为原码取反

补码:1.0011 //负数时,补码为原码取反+1

总结:

在计算机内,定点数有3种表示法:原码、反码和补码

所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1(如果+1之后有进位的,要一直往前进位,包括符号位)。


发布者:admin,转转请注明出处:http://www.yc00.com/web/1704882398a1380400.html

相关推荐

发表回复

评论列表(0条)

  • 暂无评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信