浮点数位模式和实体模式

原文:http://blog.csdn.net/microsues/article/details/6567170

1、概念:

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

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

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

 

2、转换方法

     方法一:

     

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

     方法二:

     

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

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

     

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

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值