// tttt.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
union w //32位单精度浮点数,这里使用了共用体union
{
unsigned idata; //32位浮点数的内部二进制表示对应的整数
float fdata; //32位浮点数本身
struct //各自定义32位浮点数的符号位、指数部分和尾数部分,注意这几个位域的顺序!
{
unsigned f:23; //32位浮点数的23位尾数部分
unsigned index:8; //32位浮点数的8位指数部分
unsigned sign:1; //32位浮点数的1位符号位部分
}h;
};
union ww //64位双精度浮点数的内部二进制表示对应的整数
{
__int64 ldata; //64位双精度浮点数的内部二进制表示对应的整数,注意__int64
double ddata; //64位双精度浮点数本身
struct //各自定义64位双精度浮点数的符号位、指数部分和尾数部分,注意这个几个位域的顺序!
{
unsigned f1:32; //64位双精度浮点数的52位尾数部分的低32位
unsigned f2:20; //64位双精度浮点数的52位尾数部分的高20位
unsigned index:11; //64位双精度浮点数的11位指数部分
unsigned sign:1; //64位双精度浮点数的1位符号位部分
}h;
};
int main(int argc, char* argv[])
{
w m;
m.idata =0x93534253; //直接用整数表示的32位单精度浮点数
printf("fdata:%e\n",m.fdata ); //32位单精度浮点数表示
printf("size:%d\n",sizeof(w) ); //32位单精度浮点数占用的字节数
printf("idata:%8x\n",m.idata ); //对应的32位整数
printf("sign:%1x\n",m.h.sign); //符号位
printf("index:%2x\n",m.h.index); //指数部分
printf("f:%x\n",m.h.f); //尾数部分对应的整数
__int64 longdata; //64位整数,注意__int64
ww mm; //64位双精度浮点数公共体
mm.ddata =124.235L; //64位双精度浮点数,这次直接使用浮点数
printf("ddata:%e\n",mm.ddata ); //64位双精度浮点数
printf("size:%d\n",sizeof(ww) ); //占用的字节数
printf("ldata:%16I64x\n",mm.ldata ); //64位整数的16进制表示,注意16I64x printf("sign:%x\n",mm.h.sign);
printf("index:%x\n",mm.h.index);
longdata=__int64(mm.h.f1)|(__int64(mm.h.f2)<<32); //组合成52位尾数部分
printf("f:%16I64x\n",longdata); //52位尾数部分
printf("Hello World!\n");
return 0;
}
|