1、概念:

     浮点数的位模式是计算机存储浮点数的二进制数,比如: float f = 12345; 12345是f的实体模式,f的位模式为0x4640e400 ;

     double d= 12345; 12345是d的实体模式,d的位模式为0x40c81c8000000000;

     机器代码不包含关于字段声明或字段名字的信息,即缺乏类型信息。在调试时,可以通过反汇编来查看某个数据的位模式(即二进制表示),不管数据类型怎么转换,位模式都不会改变,即不同数据类型是位模式的表现形式。

 

2、转换方法

     方法一:

     


1. #include<iostream>
2. using namespace
3. int
4. {           
5. //由于int比float范围小,所以并不能表示所有的浮点数
6. int x = 0x4640e400;  //用位模式来表示浮点数,位模式即浮点数的用二进制表示的
7. "%f/n",*(float*)&x); //打印浮点数
8. //由于int比float范围小,所以可能发生溢出
9. float
10. "%x/n",*(int*)&f);   //打印float浮点数的位模式
11.       
12. //由于long long unsigned比double范围小,所以并不能表示所有的浮点数
13. long long unsigned y = 0x40c81c8000000000;  //用位模式来表示浮点数,位模式即浮点数的用二进制表示的
14. "%f/n",(double)*(double*)&y); // 
15. //由于long long unsigned比double范围小,所以可能发生溢出
16. double
17. "%llx/n",*(long long unsigned*)&d);     //注意使用%llx格式答应,如果使用%x格式打印,会输出0;
18. long long unsigned*)&d<<endl;  //cout打印10进制形式
19.        
20. return
21. }

 

     方法二:

     



1. #include<stdio.h>
2. unsigned float2bit(float f)   //打印float的位模式,位模式即浮点数的用二进制表示的,
3. {                           //整个函数等价于:return (int)*(int*)&f;  但int的范围比float小,所以可能发生溢出
4. union{   
5. float
6.         unsigned u;  
7.     } temp;  
8.     temp.f = f;  
9. return
10.       
11. }  
12. float
13. {                           //以1个4字节的unsigned的位的形式,创建一个4字节的float
14. union{  
15. float
16.         unsigned u;  
17.     }temp;  
18.     temp.u = word0;  
19. return
20. }  
21. double
22. {                           //以两个4字节的unsigned的位的形式,创建一个8字节的double
23. union{  
24. double
25.         unsigned u[2];  
26.     }temp;  
27.     temp.u[0] = word0;  
28.     temp.u[1] = word1;  
29. return
30. }  
31. unsigned long long  double2bit(double
32. {                           //打印double的位模式
33. union{   
34. double
35. long long
36.     } temp;  
37.     temp.d = d;  
38. return
39. }  
40.   
41. int
42. {  
43. float
44. "%x/n",float2bit(f));     //打印float浮点数12345的位模式,结果为:0x4640e400
45.     unsigned w3 = 0x4640e400;  
46. float
47. "%f/n",ff);     //  打印位模式0x4640e400对应的float类型,结果为:12345.000000
48.       
49. double d = 12345;            //打印double浮点数12345的位模式,结果为:0x40c81c8000000000
50. "%llx/n",double2bit(d));  //注意使用%llx格式答应,如果使用%x格式打印,会输出0;
51.     unsigned w0 = 0x0, w1= 0x40c81c80;  
52. double dt = bit2double(w0,w1);  //打印位模式0x40c81c8000000000对应的double类型,结果为:12345.000000
53. "%f/n",dt);   
54. return
55. }

 

     方法三:只实现了实体模式到位模式的转换

     


1. #include<stdio.h>
2. typedef unsigned char
3. void show_byte(pbyte start,int
4. {  
5. int
6. for(i=0;i<len;i++)  
7. "%.2x",start[i]);  //在小端机器机器上,先打印低地址数据,在打印高地址数据
8.     putchar(10);  
9. }  
10. void show_int(int x)        //打印int的位模式
11. {  
12. sizeof(int));  
13. }  
14. void show_float(float x)    //打印float的位模式
15. {  
16. sizeof(float));  
17. }  
18. void show_double(double x)   //打印double的位模式
19. {   
20. sizeof(double));  
21. }  
22. void show_pointer(void* x)     //打印指针变量的位模式
23. {  
24. sizeof(void*));  
25. }  
26. int
27. {  
28. int
29. float fval = (float)ival;  
30. int
31. double
32. //打印int = 12345  的位模式: 0x3039
33. //打印float = 12345 的位模式: 0x4640e400 
34. //打印double = 12345 的位模式: 0x40c81c8000000000
35. void*)pval);  
36.                             
37. return
38. }