计算机中的数值表示

无符号数和带符号数

  • 在计算机中,采用数字化方式来表示数据。数据有无符号数和带符号数之分,带符号数根据其编码的不同又有原码、补码和反码3种形式。
  • 在C语言中,八进制数常以前缀0开始,十六进制数以前缀0x开始。

无符号数

  • 整个机器字长的全部二进制均表示数值位。

带符号数

  • 带符号数,即正、负数。
  • 在日常生活中,我们用正负号加绝对值来表示,称为真值。
  • 由于计算机无法识别正负号,所以需要把数的符号数码化。约定二进制的最高位为符号位,“0”表示正号,“1”表示负号。这种形式的数成为机器数。
  • 常见的机器数有原码、补码和反码三种表示形式。
  • 01001:表示+9.
  • 11001:如果是原码则表示-9,补码表示-7,反码表示-6.

原码表示法

  • 最高位作为符号位(若字长为5位则最高位为尾数第5位,字长为8位则为第8位),数值部分与真值相同。
  • 我们用X表示真值,举例(所有例子字长为5位):
  • X1=0.0110, [X1]原=0.0110;//整数部分是0则直接用来作为符号位
  • X2=-0.0110, {X2]原=1.0110;
  • X1=1101, [X1]原=01101;
  • X2=-1101, [X2]原=11101;
  • [+0]原=00000;
  • [-0]原=10000

反码表示法

  • 先转为原码形式,然后正数的数值部分不变,负数则数值部分按位取反;也就是相对补码形式少了加1这一步。
  • X1=0.0110, [X1]反=0.0110
  • X2=-0.0110, [X2]反=1.1001
  • [+0]反=00000
  • [-0]反=11111

补码表示法

  • 先变成原码,然后正数的数值部分不变,负数的真值部分则 按位取反,再加1.
  • X1=0.0110, [X1]补=0.0110;
  • X2=-0.0110, [X2]补=1.1010
  • [+0]补=[-0]补=00000 //本来-0的补码应该是100000,但是超过5位了,所以舍弃首位1.
  • 故要往回推发现不能-1时,肯迪你个是舍掉首位的1所致,先补回首位1,再来-1。

比较

  • 对于正数它们都等于真值本身。
  • 补码和反码的符号位可以和数值位一起参加运算,但原码的不行。
  • 设字长为4位:

  • 其中,-8的源码本来应该是1000,其反码应该是数值部分取反,4位全为数值部分,故其反码应为0111,再加1得其补码1000.往回推时先用1000-1得0111,发现首位被-1改变,则可确定首位也是数值部分,那么4位都取反得1000,因为首位已确定也为数值部分,因此它只可能是-8,不可能是-0.
  • 由此可见,补码相比原码多表示了一个最负的负数。

定点数与浮点数

  • 根据小数点的位置是否固定,在计算机中有两种数据格式:定点表示和浮点表示。

定点数

  • 真值到原码、反码、补码的方式相同。
  1. 定点小数
  • 定点小数即纯小数,小数点的位置固定在最高有效数位之前(即最高小数位之前)、符号位之后。

  • 也即是说整数位只有一位,固定为符号位,任何情况下不作为数值部分,定点小数一律<1。

  • 当符号位为0时,表示一个正数。

    • 最大可表示0.111…,即1-2^-n(设机器字长为n+1位)。
    • 最小可表示0.000…1,即2^-n。
  • 当符号位为1时,表示一个负数。

    • 若为原码表示法,则最负可表示-0.111…,即-(1-2^-n): [X]原=1.111…
    • 若为补码表示法,则最负可表示-1:[X]补=1.000…;倒推回去:-1->0.111…,取反->1.000…,真值->-1。同样是比原码多表示了一个最负的负数,想象一下,-0.111…最低位再加1是不是就变成-1。
  • 原码定点小数的表示范围为-(1-2-n)~(1-2-n)

  • 补码定点小数的表示范围为-1~(1-2^-n)

  1. 定点整数
  • 定点整数即纯整数,小数点位置隐含固定在最低有效数位之后。

  • 也就是说,和普通整数一样。

  • 原码定点整数的表示范围为-(2n-1)~(2n-1)

  • 补码定点整数的表示范围为-2n~(2n-1)

浮点数

  • 小数点的位置根据需要而浮动,这就是浮点数。
  • 表示形式类似科学计数法,如,二进制数0.0001101表示为0.0011012(-01),0.01101*2(-10),
    0.1101
    2(-11),……,即N=M*rE,M叫做尾数,为纯小数,常用原码或补码表示,E叫做阶码,为纯整数,常用移码或补码表示。
  • E相对于M相当于移位数,E<0,小数部分右移,空出来的部分补0。
  • 如果都用补码表示,那么格式如下:

  • 其实就是前半部分为一个整数,后半部分为一个小数。

  • 当es=0,ms=0,阶码和尾数的数值位都为1(即阶码和尾数都为最大正数)时,该浮点数为最大正数:
    X=(1-2-n)*2(2^k-1)。
    -当es=0,阶码的数值位全为1;ms=1,尾数的数值位全为0(即阶码为最大正数,尾数为最小负数(最负负数))时,该浮点数表示最小负数:-1*2(2k-1)。

  • 规格化浮点数:最上面表示中,只有0.1101*2^(-11)是规格化数。

  • 在尾数用源码表示时,规格化浮点数的最高数位总等于1.

  • 用补码表示时,尾数最高数位与符号位不同,也就是为正数时,最高数位为1,为负数时,最高数位为0.

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值