int与float在内存中的存储形式_对比与转换
来源:互联网 发布:java环境配置 编辑:程序博客网 时间:2024/05/29 16:55
看faac代码中看到int与float的联合体,看不懂代码,于是对这两种数据类型的存储方式做了一番了解
typedef union {
float f;
int i;
} fi_union;
//faac aacquant.c 285行
int:
长度 4字节
以补码形式存数数据,首位为符号位,数据的二进制原码,经过反码(符号位不变),再加1得到数据的补码进行存储
还原时可减1,再对非符号位进行反码,记得到原码,转换为十进制即可
float:
长度 4字节
SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
S: 表示浮点数正负,1为负数,0为正数
E: 指数加上127后的值的二进制数(还原时将该数减127,得到指数的二进制)
M: 底数,表示小数点后的二进制,隐含了个位上的1,即还原时,底数为1.MMMMM...
注意:这里有个特例,浮点数 为0时,指数和底数都为0,但此前的公式不成立。因为2的0次方为1,所以,0是个特例。当然,这个特例也不用认为去干扰,编译器会自动去识别。
如-12.5的float形式为
11000001 01001000 00000000 00000000
S:1,负数
E:1000001 0 == 130 减去127得3,即指数为3
M:100 1000 0000 0000 0000 0000 实际底数为1.1001
还原:符号 2^3 乘以 1.1001 即小数点右移3位 得到1100.1 即12.5(注意0.1表示2的-1次方,这里1在第-1位上)
加符号即得-12.5
为了验证int与float之间的转换,可以把-12.5的二进制按照int型翻译成十进制
符号位:1
补码:100 0001 0100 1000 0000 0000 0000 0000
减一:100 0001 0100 0111 1111 1111 1111 1111
反码:011 1110 1011 1000 0000 0000 0000 0000
十进制:1052246016
即-1052246016
利用union验证,分别按%d %f 输出
补充double型
double:
长度 8字节
存储模式与float相同,只不过不同字段的长度不同,见下表
符号位 阶码 尾数 长度
float 1 8 23 32
double 1 11 52 64
其还原的计算方式完全相同。
double到float怎么转换?关键是阶码怎么截取?
- int与float在内存中的存储形式_对比与转换
- short与int型在内存中的存储形式
- float数据在内存中的存储形式
- float型数据在内存中的存储形式
- float型数据在内存中的存储形式
- float型数据在内存中的存储形式
- float型数据在内存中的存储形式
- 单精度float变量在内存中的存储形式
- float与double在内存中储存的形式
- float型在内存中的储存形式
- 常量与变量以及在内存中存储形式
- float数据在内存中的存储方法
- float数据在内存中的存储方法
- float数据在内存中的存储方法
- float在内存中的存储方式
- float数据在内存中的存储方法
- float数据在内存中的存储方法
- float数据在内存中的存储方法
- Android - User Interface
- 【OpenCV】边缘检测:梯度,sobel算子的理解
- ASCII码对应表chr(9)、chr(10)、chr(13)、chr(32)、chr(34)、chr(39)、
- Introduction to Recommender System 之 Module 4 User-User Collaborative Filtering
- 南大软院大神养成计划第二十一天
- int与float在内存中的存储形式_对比与转换
- SSL/TLS 协议详解
- 编程珠玑 第三部分 应用
- HTML5基础--新特性
- 忘记mysq rootl密码后解决办法
- java竞赛-大数阶乘问题
- C/C++检测进程是否被调试
- edX-Cypress OVA导入后个性定制
- HTML5基础--开发工具