浮点数在内存中的十六进制表示形式

一、浮点数的介绍

单精度float :小数点后6位

双精度double :小数点后12位

在c语言中将后缀为f或者F的浮点常量当作float型。如12.3f、23.44F

没有后锥的浮点常量当作double类型。如sizeof(1.333)= 8

有后缀l或L的浮点常量当作long double ,如432.44L、23.22l

对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit

二、浮点数的组成

浮点数二进制表示有三个部分(32)

  1. 符号位部分(1bit) 0-正数 1-负数
  2. 指数部分(8bit) 2^7-1 ==127 根据127进行偏移
  3. 基数部分(23bit)浮点数具体数值的实际表达

单精度浮点数计算公式:(-1)S * (1 + 有效位) * 2(阶码-127)

双精度浮点数计算公式:(-1)S * (1 + 有效位) * 2(阶码-1023)

单精度的指数部分是-126~~+127加上127,指数值的大小从1~254(0和255是特殊值)

单精度:

共占32 bit位;

移码的偏置值为127;

规格化阶码范围为:0000 0001(1)~1111 1110(254),全0和全1用来表示特殊值

双精度:

共占64 bit位,移码的偏置值为1023

三、浮点数与十六进制相互转换

1.浮点数转换为十六进制

    1. 将十进制转换为二进制
    2. 将二进制转换为科学计数法(2)
    3. 构造浮点数二进制原型
    4. 重新组合并由二进制转换为十六进制

1、将6.91转换成二进制形式,有效位长为31(8+23)

-> 整数:6(10进制) -- 110(2进制,实际位长为3)

-> 小数:0.91(10进制)-- 111010001111010111000(2进制,实际位长21(23-3+1))

小数转换为二进制的方法:小数部分乘以2,取整数部分依次从左往右放在小数点后,直至小数点后为0。

0.91 * 2 = 1.82 ... 1

0.82 * 2 = 1.64 ... 1

0.64 * 2 = 1.28 ... 1

0.28 * 2 = 0.56 ... 0

0.56 * 2 = 1.12 ... 1

0.12 * 2 = 0.24 ... 0

0.24 * 2 = 0.48 ... 0

0.48 * 2 = 0.96 ... 0

0.96 * 2 = 1.92 ... 1

0.92 * 2 = 1.84 ... 1

0.84 * 2 = 1.68 ... 1

0.68 * 2 = 1.36 ... 1

0.36 * 2 = 0.72 ... 0

0.72 * 2 = 1.44 ... 1

0.44 * 2 = 0.88 ... 0

0.88 * 2 = 1.76 ... 1

0.76 * 2 = 1.52 ... 1

0.52 * 2 = 1.04 ... 1

0.04 * 2 = 0.08 ... 0

0.08 * 2 = 0.16 ... 0

0.16 * 2 = 0.32 ... 0

至此,6.91的二进制为:110.111010001111010111000

2、将原始二进制值规范化:调整使其实数的第一位大于1小于2

6.91 = 1.10111010001111010111000*2^2

3、构造浮点数的二进制原型

S: 0

Exp: 2 + 127(10进制) = 129(10进制) = 10000001(2进制)

Fraction: 10111010001111010111000 (注意:小数点前面的1不要了)

4、重新组合并由二进制转换成十六进制

0 10000001 10111010001111010111000

= 0100 0000 1101 1101 0001 1110 1011 1000

= 4 0 D D 1 E B 8

即6.91的十六进制为0x40DD 1EB8

负数

将 -12.75 转换为二进制表示:

整数部分 12= 1100

小数部分 75=11

第三步将数规格化 1100.11=1.10011 * 2^3

注意这里的3是 x - 127 = 3

所以 x = 130 = 127+3=128 + 2 =1000 0010B

最终存储为:1100 0001 0100 1100 0000 0000 0000 0000

C 1 4 C 0 0 0 0

2.十六进制转换为浮点数

  1. 十六进制转换为二进制
  2. 分离浮点数二进制原型
  3. 取有效位+1还原为浮点数二进制
  4. 注意符号位
  • 15
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值