概述
float的内存布局和转换
float一共32位,其结构定义如下:
31 | 30-23 | 22-0 |
---|---|---|
符号位(sign) | 指数部分(exp) | 小数部分(mag) |
sign:符号位就一位,0表示正数,1表示负数
exp: 指数部分,无符号正数,最大值0xff
mag:小数部分,定点小数,小数点在最左边,最大值 0x7FFFFF
float 计算公式 =pow(-1,sign) * (1+mag) * pow(2,exp-127)
#ifndef FLOATMEM_H
#define FLOATMEM_H
#include<iostream>
inline void floatMem(float f)
{
const uint32_t mag_max = 0x7FFFFF;
const uint8_t exp_max = 0xFF;
const uint8_t sign_max = 0x01;
uint32_t u32;
int sign;
int exp;
int mag;
float d_mag;
float resultFloat;
u32 = *(int*)&f;
sign = (u32>>31)&sign_max;
exp = (u32>>23)&exp_max;
mag = u32&mag_max;
d_mag = 1.0f*mag/(mag_max+1);
resultFloat = (sign==0?1:-1)*(1+d_mag)*pow(2,exp-127);
printf("input uint32: =0x%08xn",u32);
printf("input float : = %fn",f);
printf("sign=%X,exp=0x%X,mag=0x%Xn",sign,exp,mag);
printf("result float: = %fn",resultFloat);
printf("===n");
fflush(stdout);
}
static int ret = []()-> int{
floatMem(0.987654321);
uint32_t
u = 0x3f7c0000;
float ff = 0;
memcpy(&ff,&u,sizeof (uint32_t));
floatMem(ff);
return 0;
}();
#endif // FLOATMEM_H
最后
以上就是满意白云为你收集整理的float的内存布局和转换的全部内容,希望文章能够帮你解决float的内存布局和转换所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复