注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

技术行者

时代的车轮在按照摩尔定律滚动。

 
 
 

日志

 
 

java位移运算导致数值为负数  

2011-12-13 13:39:00|  分类: Java |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

问题表现:java位移运算导致数值为负数

 

问题分析:

关键源代码:

int startTime = (int) (promotions >> 32);

int p = (int) (promotions & 0xFFFFFFFF);

int duraTime = p >> 16;

int rate = (int) (p & 0xFFFF);

int endTime = startTime + duraTime * 60;

 

源代码中:int duraTime = p >> 16;右移位后,符号位为1,导致了持续时间duraTime为负数的情况。

 

摘取代码,逐步分析验证:

Promotions= 5682372155986092840

int startTime = (int) (promotions >> 32);

int p = (int) (promotions & 0xFFFFFFFF); //p 的二进制为10001111 00011111 00100011 00101000(int一共32bit),被解析为负值

int duraTime = p >> 16;             //p被认为是负数,右移位的时候,左边多出来的补1, duraTime的二进制为11111111 11111111 10001111 00011111(duraTime被解析为负值)

int rate = (int) (p & 0xFFFF);

int endTime = startTime + duraTime * 60;

 

 

正确的代码1:

int startTime = (int) (promotions >>> 32); // 无符号右移,防止出现负数

int p = (int) (promotions & 0xFFFFFFFF);  //p 的二进制为10001111 00011111 00100011 00101000(int一共32bit)

int duraTime = p >>> 16;          //右移位的时候,左边多出来的补0, duraTime的二进制为00000000 00000000 10001111 00011111(duraTime被解析为负值)

int rate = (int) (p & 0xFFFF);

int endTime = startTime + duraTime * 60;


正确的代码2:

 不适用int类型,而使用long类型,这样符号位第一位则为0,位移的时候,也不会出现为负数的情况。

 

附带的java位运算相关的知识:

位移运算的过程:

 

移位运算符

包括:

“>> 右移,高位补符号位”;

“>>> 无符号右移,高位补0”;

“<< 左移”;

 

例子:

-5>>3=-1

1111 1111 1111 1111 1111 1111 1111 1011

1111 1111 1111 1111 1111 1111 1111 1111

因为是负数,高位补1

 

 

35 >> 2=8

0000 0000 0000 0000 0000 0000 0010 0011  

0000 0000 0000 0000 0000 0000 0000 1000 

因为是正数,高位补0

 

 

-5>>>3=536870911 

1111 1111 1111 1111 1111 1111 1111 1011

0001 1111 1111 1111 1111 1111 1111 1111

因为是无符号位移,高位强制补0


  评论这张
 
阅读(326)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017