我是靠谱客的博主 满意白云,最近开发中收集的这篇文章主要介绍float的内存布局和转换,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

float的内存布局和转换

float一共32位,其结构定义如下:

3130-2322-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的内存布局和转换所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(41)

评论列表共有 0 条评论

立即
投稿
返回
顶部