如何查看float在内存中存储方式
float fla = -1000;
unsigned int *pfla = (unsigned int*)&fla;
printf("fla=%X\n",*pfla);
#include<stdio.h>
int main(int argc,char *argv[])
{
float f=8.25f;
int *i = (int*)&f;
printf("%d\n",*i);
return 0;
}
浮点数的操作,尤其是大小比较,是比较棘手的,需要计算机组成原理的相关知识,恰恰我又没学过这门课,只能边干边学。
根据IEEE 754规定,浮点数有自己的保存格式,其中,最高位是符号位,这一点是规定好的。1为负,0为正
上面的代码可以将浮点数在内存中的保存以十六进制显示出来,
通过这个网站的对比,https://www.h-schmidt.net/FloatConverter/IEEE754.html,代码运行正确。
-1000十六进制就是0xc47a0000,最高位就是负的。
以下是知乎转载,
作者:匿名用户
链接:https://www.zhihu.com/question/21711083/answer/376836065
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
计算机再进行数的表达时,没有直接对正负、小数点的表达方式,人类设计了多种计数编码方式的,但最著名、应用最广泛的便是IEEE754标准。
计算机在存储一个数的时候,采用的是多个不同位置的二进制数代表不同的意义,如单精度浮点数和双精度浮点数,单精度浮点数和双精度浮点数的本质区别是计数范围不同。
我们举例为单精度浮点数,设这串二进制数为a[31:0],最高位a[31]代表的是符号位,a[23:30]位代表的是阶码也称偏移码(象征着小数点在数据中的位置),a[22,0]代表尾数(象征着拿掉小数点之后的不含小数点的数)。注意:象征不意味着相等,在实际的二进制中我们叫做:符号位真值、阶码真值、尾数真值。
我们在编码空间(计算机实际处理时)要对符号位、阶码、尾数进行操作,但在实际中我们认知的称为符号位真值、阶码真值、尾数真值。编码空间是真值的映射。
符号位=符号位真值
阶码=阶码真值+127
尾数=尾数真值-1
所以,一般在计算机里将二进制数这样表达:
我们从这个公式中可以分析出,阶码真值控制着小数点的位置,阶码每加1,整个数值增大2倍,小数点则向右移1位;阶码每减1,整个数值减小2倍,小数点则向左移动1位。
单精度浮点数
因为阶码真值有符号数,计算机无法表示有符号数,通常要引入符号位,但IEEE754则有另一种编码方式,因为阶码是8位宽,可以表达2^8=256个数,我们至多可以表达出-127~+127共计255个数,我们从阶码的0000-0000开始对应-127~+127共计255个数,所以就有了:阶码=阶码真值+127。
我们在计算初始要进行编码规范化,除明晰符号位、阶码值、补码值外,我们还要对小数点进行初始化,为了最大范围地表达出我们的数,所以我们默认该数的小数点在1后,即尾数的最高位a[22]必须是1,在规范化的过程中,小数点右移阶码要减1,小数点左移阶码要加1。
关于浮点数,需要再说几句:
在二进制,第一个有效数字必定是“1”,因此这个“1”并不会存储。
浮点数不能精确表示其范围内的所有数。
可精确表示的数不是均匀分布的,越靠近0越稠密。
默认舍入方式为向偶舍入,也被称为最接近的值舍入。
不遵守普遍的算数属性,比如结合律。
如何查看float在内存中存储方式的更多相关文章
- c/c++浮点数在内存中存储方式
转自:https://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html 任何数据在内存中都是以二进制的形式存储的,例如一个shor ...
- c语言中float、double、long double在内存中存储方式
存储格式中的二机制转为浮点数: 浮点型变量在计算机内存中占用4个字节(4 Byte),即32-bit,一个浮点数由2部分组成:底数m 和 指数e: 底数部分:使用2进制数来表示此浮点数的实际值: 指 ...
- float数据在内存中存储方式
float类型数字在计算机中用4个字节存储.遵循IEEE-754格式标准: 一个浮点数有3部分组成: 符号部分,0 表示正,1表示负. 底数部分 使用二进制数来表示此浮点数的实际值,底数部分实际是占用 ...
- Float在内存中的存储方式及IEC61131处理
Float在内存中的存储方式及IEC61131处理 1,fp32(32bits float)类型数据在存储器中占用4Bytes存储,且遵循IEEE-754标准: 一个浮点数分三部分组成: 符号位s(1 ...
- float浮点数的二进制存储方式及转换
int和float都是4字节32位表示形式.为什么float的范围大于int? float精度为6-7位.1.66*10^10的数字结果并不是166 0000 0000 指数越大,误差越大. 这些问题 ...
- 求int型正整数在内存中存储时1的个数
题目描述: 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: 输入一个整数(int类型) 输出描述: 这个数转换成2进制后,输出1的个数 输入例子: 5 输出例子: ...
- vs中调试程序查看变量在内存中的内容的方法
vs中调试程序 查看变量在内存中的内容的方法 https://blog.csdn.net/guojg1988/article/details/42922149 原文链接:http://www.sows ...
- 求int型正整数在内存中存储时1的个数 && int型的数到底最大是多少?
输入一个int型的正整数(十位数之内!嘞!),计算出该int型数据在内存中存储时1的个数. #include<bits/stdc++.h> using namespace std; int ...
- 华为oj之求int型正整数在内存中存储时1的个数
题目: 求int型正整数在内存中存储时1的个数 热度指数:4427 时间限制:1秒 空间限制:32768K 题目描述 输入一个int型的正整数,计算出该int型数据在内存中存储时1的个数. 输入描述: ...
随机推荐
- TypeScript 高级类型
⒈交叉类型(Intersection Types) 交叉类型是将多个类型合并为一个类型. 这让我们可以把现有的多种类型叠加到一起成为一种类型,它包含了所需的所有类型的特性. 例如, Person &a ...
- 快速创建一个SpringBoot项目并整合Mybatis
2019-09-15 一.Maven环境搭建 1.导入jar坐标 <project xmlns="http://maven.apache.org/POM/4.0.0" xml ...
- Ribbon【入门】
公共依赖: <parent> <groupId>org.springframework.boot</groupId> <artifactId>sprin ...
- Python中的Nonetype类型判断
在学习过程中遇到了程序崩溃,反馈的原因是变量的类型是 Nonetype 那么如何判断该类型 if Lines is None: print(type(Lines)) 其实 Nonetype 就是No ...
- Vue CLI 3开发中屏蔽的EsLint错误 (.eslintrc.js 在vue3+中 修改这个)
1.关闭eslint校验有了eslint的校验,可以来规范开发人员的代码,是挺好的.但是有些像缩进.空格.空白行之类的规范,在开发过程中一直报错,未免太过于苛刻了.所以,我还是会选择关闭eslint校 ...
- poj 2406 求最短重复字串
题解: KMP中next数组的巧妙运用.在这里我们假设这个字符串的长度是len,那么如果len可以被len-next[len]整除的话,我们就可以说len-next[len]就是那个最短子串的长度为什 ...
- (十一)web服务与javaweb结合(2)
一.解决问题及解决方法 解决问题:上章节用监听器的方式是有缺陷的:web服务的端口和web工程的端口不能一致. 解决方案:将webService绑定到web工程中,使得共用一个端口. 二.案例 2.1 ...
- Asp.Net Core 2.0 之旅---@Html.Action
原文:Asp.Net Core 2.0 之旅---@Html.Action 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接:https: ...
- springboot启动流程(五)创建ApplicationContext
所有文章 https://www.cnblogs.com/lay2017/p/11478237.html 正文 springboot在启动过程中将会根据当前应用的类型创建对应的ApplicationC ...
- 你所不知道的 Console
1.凡人视角 打印字符串 代码: console.log("I am a 凡人"); 打印提示消息 代码: console.info("Yes, you arm a 凡人 ...