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. }