double类型数据 位移操作

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

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位的整型。  

其它的,你看着办吧。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值