整数与浮点数的表示

本文详细介绍了二进制整数的表示,包括有符号整数的原码、反码和补码编码方式,以及符号扩展的概念。同时讲解了浮点数在IEEE754标准下的构成,包括符号位、阶码和尾数,并阐述了浮点数取值范围和精度。注意,整数和浮点数的比较不能直接用等于操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有符号整数

首先约定数的真值:一个n位的二进制数a=(±)xn1xn2...x0,如果不使用符号,则默认认为是正数。真值没有符号位。

三种编码方式
  • 原码(符号与幅值,sign and magnitude)
    一个n位的二进制原码表示的数,第1位是符号位,后面n1位是数的绝对值。原码的缺点在于有两个0:符号位分别为10,其他位均为0时。
  • 反码(one’s complement)
    反码是作为原码和补码之间的一种过渡。在反码表示法中,一个数的相反数就是将其每一位取反。因此第一位也是符号位。正数的反码与其原码相同,负数的反码的符号位为1(负号),其余的位将真值的每一位取反。
  • 补码
    补码是硬件使用的编码。对于正数,补码与其原码相同;负数的补码,是其反码的最低位再加上一。
    虽然n位有符号整数的补码真值使用公式x=2n1xn1+n2i=02ixi计算,但是同样满足最高位xn1确定符号。
    对于使用补码的有符号整数,其取值范围是x[2n1,2n11]
符号扩展(sign extension)
  • 对于一个有限位数的有符号整数的补码表示,以复制符号位的方式将其扩展到更高的位数,叫做符号扩展。比如将210的16位补码表示
    0000,0000,0000,0010
    进行符号扩展:(符号位为0进行复制)
    0000,0000,0000,0000,0000,0000,0000,0010
    又比如将210的16位补码表示
    1111,1111,1111,1110
    进行符号扩展:(符号位为1进行复制)
    1111,1111,1111,1111,1111,1111,1111,1110
注意
  • 注意区分由原码、反码计算补码(p.21)和由补码计算其相反数的补码(p.28)
    由原码计算补码,要区分正负号;正数的补码和原码相同;负数的补码,先将原码的非符号位全部按位取反得到反码,然后再加1得到补码;
    对一个数的补码计算其相反数的补码,只需要对其所有位按位取反,然后再加上1就可以了。

无符号整数

无符号整数不包含符号位,所有的位数直接按照二进制表示存储真值。
n位无符号整数的取值范围x[0,2n1]

浮点数(IEEE754标准)

IEEE754标准的浮点数按照三部分构成S|E|M
在规格化表示时其真值为x=(1)S(1+M)2E127
以32位浮点数(C语言中的float类型)为例:
第1位为符号位S,0代表正数,1代表负数;
第2~9位(共8位)为阶码(指数部分)。在IEEE754标准中,阶码按照移码的方式存储,E=e+127,其中e是真实的指数。阶码的存储范围是0<E<255(开区间,E=0,255有特殊含义)因此实际指数范围126<e<127,决定了32位浮点数的取值范围21271<±x<2127+13.4×1038(其中尾数的特殊情况M=1.1111...2)
剩余23位为尾数M,决定了32位浮点数的有效数字(精度)为lg2236位。

浮点数不能简单使用==判等。

指数尾数意义
000
0非0正负规格化数
1~254-正负浮点数
2550正负无穷
255非0Not a Number
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值