计算机中的整数与浮点数

  版权声明 未经作者允许,严禁用于商业出版,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!


1 整数

  • 整数在计算机中使用补码表示。

    • 补码:正数的补码=原码;负数的补码=反码+1,如

      • [+1] = 0000 0001
      • [- 1]= 1111 1111
    • 补码的作用:

      • 一是为了将减法转为加法,[A-B]=[A]+[-B]补码
      • 二是统一+0和-0。[+0]=[-0]
    • 补码转为原码

      • 原码=补码的补码
      • 原码= 补码-1的反码

原码:原码就是直接将数转为二进制,对于有符号的数来说,用第一位表示符号,1表示负数,0表示正数。 >其余位表示值。如:

[+1] = 0000 0001
[- 1]= 1000 0001

反码:正数的反码=原码;负数的反码:符号位不变,其他位按位取反。如:

[+1] = 0000 0001
[- 1]= 1111 1110

2 浮点数

2.1 IEEE规定浮点数在计算机中的表示方法

浮点数在计算机中不是以二进制原码来表示,而是用二进制科学计数法表示

  • 将十进制浮点数转为二进制浮点数
  • 将二进制浮点数用规范的二进制科学计数法表示为: ±1.bbbb...2i ± 1. b b b b . . . ∗ 2 i

    • ±叫做符号位,放在左边第一位。
    • bbb…叫做尾数,放在尾数域中,由于规范的二进制科学计数法的第一位都是1,所以省略
      • float(4B)中尾数域为占23尾,精度为24位
      • double(8B)中尾数域占52尾,精度为53位
    • i叫做实际指数,由于指数有正有负,而负数的补码与原码不同,为了解决这个问题,给实际指数i加上一个偏差后放在指数域中
      • 对于单精度float类型,指数域有8位,可以表示0~255,实际值为-127~128,其中0和255用于保存特殊值,偏差为127。
      • 对于双精度double类型,指数域有11位,可以表示0~2047,实际值为-1023~1024,其中0和2047用于保存特殊值,偏差为1023。
  • 符号域、指数域、尾数域的占位情况

    • 对于float类型的数据,其在内存中的表示为:float
    • 对于double类型,其表示形式如下:double
  • IEEE特殊值规定

    • NaN错误
      • 实数范围内发生对负数开平方时产生此错误
      • 指数域全为1,尾数域不全为0,表示该错误
    • 正负无穷大
      • 两个大数相乘产生的上溢,IEEE规定此时不是将结果舍入为可以保存的最大的浮点数(因为这个数可能离实际的结果相差太远而毫无意义),而是将其舍入为无穷。
      • 指数域全1,尾数域全0,表示该值
    • 正负0
      • IEEE 标准的浮点数格式中,小数点左侧的1是隐藏的,而零显然需要尾数必须是零。因此零也就无法直接用这种格式表达而只能特殊处理
      • 指数域全0,尾数域全0,表示该值
    • 非规范化浮点数: ±0.bbbb...2i ± 0. b b b b . . . ∗ 2 i
      • 两个极小数相减的差可能会下溢
      • 指数域全0,尾数域不全0,表示此时采用非规范浮点数,非规范浮点数的指数偏差比规范浮点数大1

2.2 计算机中表示的浮点数转为十进制

=(1)(1+i=1(bi2i))2 十 进 制 = ( − 1 ) 符 号 位 ( 1 + ∑ i = 1 尾 数 域 长 度 ( b 尾 数 域 长 度 − i ∗ 2 − i ) ) ∗ 2 指 数 域 值 ( 移 码 表 示 ) − 偏 差

示列:

13.5=(1)1(1+i=123(b23i2i))2130127 13.5 十 进 制 = ( − 1 ) 1 ( 1 + ∑ i = 1 23 ( b 23 − i ∗ 2 − i ) ) ∗ 2 130 − 127


  版权声明 未经作者允许,严禁用于商业出版,否则追究法律责任。网络转载请注明出处,这是对原创者的起码的尊重!!!


你可能感兴趣的:(程序员基础知识,原码,浮点数,补码,反码,移码)