【C语言】浮点数二进制补码|存储模式
【摘要】 【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)