【C语言】浮点数二进制补码|存储模式

举报
謓泽 发表于 2023/09/23 19:21:38 2023/09/23
【摘要】 【C语言】浮点数二进制补码|存储模式

浮点数二进制补码

  • 例如:7.0 — 0111 — 0111.0(小数点后面给个0就可以了) 这就是7.0的二进制的表现形式😉
  • 任何一个二进制的浮点数V可以表示成下面的形式:
  • (-1)^ M * 2 ^ E
  • (-1)^ s表示符号位,当s = 0的时候,V = 正数除了0以外,任何数的0次方等于1)当s=1的时候,V = 负数
  • M表示的是有效数字,大于等于1,小于2
  • 2 ^ E表示指数位

存储模式图: 

 

 

  • 如下实例:浮点数9.0
  •     1001
  •     1001.0
  •     1.001 * 2 ^ 3  —— 注意:这个是二进制
  •     (-1) ^ 0 * 1.001 * 2 ^ 3  = (-1)^ M * 2 ^ E
  •     0 10000010 00100000000000000000000  —— E = 3 + 127 = 130 
  •     当成原码直接打印的就是我们上面说的数字 1091567616
  •     这样就可以确定的是 — s = 0 ,M = 1.001 ,E = 3 ,注意M = 1.001 实际上是:0001 
  • 如下实例:浮点数0.5
  •     0.5
  •     0.1 — 注意:这个是二进制当中的 -1 对于小数点来说后面的第一位数,是2的负一次方就是0.5
  •     1.0 *  2 ^ -1 —— 转换成科学计数法 
  •     (-1 ^ 0) * 1.0 * 2 ^ -1  —— 注意:指数E为一个无符号数字来看待的
  •     s = 0,M = 1.0,E = -1
  • 对于八位的E来说是,这个中间的数是:127,对于十一位的E来说是,这个中间数是1023,其实就是如果你的E是负数的话,就拿-1来举个例子 八位的就是:-1+127 = 126,11位的就是:-1+1023 = 1022 
  •  E不为全0也不为全1

  • 浮点数 5.5 
  • 101.1   // 前面是101按照8421码来,后面的就是2的负一次方 等于 0.5
  • (-1) ^ 0 * 1.001 * 2 ^ 2
  • s = 0 ,M = 1.011 ,E = 2 (E+127=129)
  • 0100 0000 1011 0000 0000 0000 0000 0000 ——这里E的存储是129,E的值还是129-127=2,如果你是double的数字那么这里要减去1023才能的到真实的E的值
  • 0x40B00000 —— 转换出来的二进制转换十六进制数字
  • 调试当中内存的结果:

  •  E全为0 (了解即可)

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,有效数字M不再加上第一位的1,而是为了还原位0.xxxxxx的小数,这样做是为了表示±0,以及接近于0的很小数字。

  •  E全为1 (了解即可)

这时,如果有效数字M全为0,表示±无穷打(正负取决于符号位s)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。