double类型数据 位移操作 .

来源:互联网 发布:python的发展趋势 编辑:程序博客网 时间:2024/06/05 09:33

由于位操作的对象是整型变量,所以你必须利用某种转换让编译器把浮点变量暂时当成整型变量。不过,直接强制转换是不行的:

float   f   =   12.34;
int   i   =   (int)f;               //   i最后等于12而不是你想要的结果!

所以,转换必须是“间接”的:

float   f   =   12.34;
int   *p   =   (int*)&f;           //   用指针就OK!

然后,你已经有int指针,要进行位操作完全没问题:

(*p)   < <   3;                           //试试看   :)
 对double的位操作没有什么实际的意义。
如楼上所言,你那样是可以实现float的移位,但没有现成的办法很好的支持double(占八个字节)。

而且我想不通楼主为什么要对它进行位操作?

无论是&,~,|,> > , < <,^都没有什么实际的意义。
因为浮点数(包括float,double)的数据一定的位数表示阶码,
一部分表地尾数,首位表示符号位,其表示的值本身是通过
运算得出的,而非像整数一样,可以从十六进制看出点什么,
如果浮点数发生位操作,后果不堪设想。
试想,如果   double   i   =   1;
              i   < <   1;(如果支持的话),你算让它等于多少?
(二进制表示为:0000000000000000000000000000000000000000000000001111000000111111)

浮点数   2(二进制表示为)
0000000000000000000000000000000000000000000000000000000001000000

还是1.3718659e+303(这个数的二进制是)   (0000000000000000000000000000000000000000000000011110000001111110)

看了这个例子,你还想位操作吗?
 关于double占8个字节的问题,解决方案一:

使用union:

union   X{    
                      double   d;
                      int   arr[2];
};

但应用很受限制,因为实际上double被分成两截。

方案二:
                   
使用C99标准提供的标准int数据类型:int64_t或uint64_t:

double   d   =   12.34;
int64_t   *pi64   =   (int64_t*)&d;
uint64_t   *pu64   =   (uint64_t*)&d;

C99保证所有符合标准的平台如果实现了   int64_t、uint64_t,则它们一定是64位的整型。  

其它的,你看着办吧。

原创粉丝点击