原文:http://blog.youkuaiyun.com/microsues/article/details/6567170
1、概念:
浮点数的位模式是计算机存储浮点数的二进制数,比如: float f = 12345; 12345是f的实体模式,f的位模式为0x4640e400 ;
double d= 12345; 12345是d的实体模式,d的位模式为0x40c81c8000000000;
机器代码不包含关于字段声明或字段名字的信息,即缺乏类型信息。在调试时,可以通过反汇编来查看某个数据的位模式(即二进制表示),不管数据类型怎么转换,位模式都不会改变,即不同数据类型是位模式的表现形式。
2、转换方法
方法一:
- #include<iostream>
- using namespace std;
- int main()
- {
- //由于int比float范围小,所以并不能表示所有的浮点数
- int x = 0x4640e400; //用位模式来表示浮点数,位模式即浮点数的用二进制表示的
- printf("%f/n",*(float*)&x); //打印浮点数
- //由于int比float范围小,所以可能发生溢出
- float f = 12345;
- printf("%x/n",*(int*)&f); //打印float浮点数的位模式
- //由于long long unsigned比double范围小,所以并不能表示所有的浮点数
- long long unsigned y = 0x40c81c8000000000; //用位模式来表示浮点数,位模式即浮点数的用二进制表示的
- printf("%f/n",(double)*(double*)&y); //
- //由于long long unsigned比double范围小,所以可能发生溢出
- double d = 12345;
- printf("%llx/n",*(long long unsigned*)&d); //注意使用%llx格式答应,如果使用%x格式打印,会输出0;
- cout<<*(long long unsigned*)&d<<endl; //cout打印10进制形式
- return 0;
- }
方法二:
- #include<stdio.h>
- unsigned float2bit(float f) //打印float的位模式,位模式即浮点数的用二进制表示的,
- { //整个函数等价于:return (int)*(int*)&f; 但int的范围比float小,所以可能发生溢出
- union{
- float f;
- unsigned u;
- } temp;
- temp.f = f;
- return temp.u;
- }
- float bit2float(unsigned word0)
- { //以1个4字节的unsigned的位的形式,创建一个4字节的float
- union{
- float d;
- unsigned u;
- }temp;
- temp.u = word0;
- return temp.d;
- }
- double bit2double(unsigned word0,unsigned word1)
- { //以两个4字节的unsigned的位的形式,创建一个8字节的double
- union{
- double d;
- unsigned u[2];
- }temp;
- temp.u[0] = word0;
- temp.u[1] = word1;
- return temp.d;
- }
- unsigned long long double2bit(double d)
- { //打印double的位模式
- union{
- double d;
- unsigned long long u;
- } temp;
- temp.d = d;
- return temp.u;
- }
- int main()
- {
- float f = 12345;
- printf("%x/n",float2bit(f)); //打印float浮点数12345的位模式,结果为:0x4640e400
- unsigned w3 = 0x4640e400;
- float ff = bit2float(w3);
- printf("%f/n",ff); // 打印位模式0x4640e400对应的float类型,结果为:12345.000000
- double d = 12345; //打印double浮点数12345的位模式,结果为:0x40c81c8000000000
- printf("%llx/n",double2bit(d)); //注意使用%llx格式答应,如果使用%x格式打印,会输出0;
- unsigned w0 = 0x0, w1= 0x40c81c80;
- double dt = bit2double(w0,w1); //打印位模式0x40c81c8000000000对应的double类型,结果为:12345.000000
- printf("%f/n",dt);
- return 0;
- }
方法三:只实现了实体模式到位模式的转换
- #include<stdio.h>
- typedef unsigned char *pbyte;
- void show_byte(pbyte start,int len)
- {
- int i;
- for(i=0;i<len;i++)
- printf("%.2x",start[i]); //在小端机器机器上,先打印低地址数据,在打印高地址数据
- putchar(10);
- }
- void show_int(int x) //打印int的位模式
- {
- show_byte((pbyte)&x,sizeof(int));
- }
- void show_float(float x) //打印float的位模式
- {
- show_byte((pbyte)&x,sizeof(float));
- }
- void show_double(double x) //打印double的位模式
- {
- show_byte((pbyte)&x,sizeof(double));
- }
- void show_pointer(void* x) //打印指针变量的位模式
- {
- show_byte((pbyte)&x,sizeof(void*));
- }
- int main()
- {
- int ival = 12345;
- float fval = (float)ival;
- int *pval = &ival;
- double dd = 12345;
- show_int(ival); //打印int = 12345 的位模式: 0x3039
- show_float(fval); //打印float = 12345 的位模式: 0x4640e400
- show_double(dd); //打印double = 12345 的位模式: 0x40c81c8000000000
- show_pointer((void*)pval);
- return 0;
- }