关于java长整型溢出的问题

ispotato 2011-08-10 10:43:13
通过读二进制文件,将诸如“A0 0E 98 32”的四个16进制数拼接成一个整数,目的是它对应的10进制值除以1557710.5,得出最终的数值。

程序如下:
byte[] b = new byte[4];
c = fis.read(b);//读取二进制文件的四个16进制数值,比如“A0 0E 98 32”
long k = 0;
for (int i=0; i<b.length; i++) {
k = (k<<4) | b[i]; //将“A0 0E 98 32”拼接为一个16进制数:A00E9832
}

double r=k/1557710.5; //这里出现r<0,说明k溢出了。


结果长整型k溢出了,r是负数,在c语言中有unsigned long int或__int64,但java没有这种类型,请问怎样解决溢出的问题?
谢谢!
...全文
348 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
luohuijun619 2011-08-11
  • 打赏
  • 举报
回复
BigInteger
hymxdf 2011-08-10
  • 打赏
  • 举报
回复
Java是我一直想学习的
飞跃颠峰 2011-08-10
  • 打赏
  • 举报
回复
4个字节是不可能令长整型溢出的,长整型有8个字节呢
出错的原因是这里
k = (k<<4) | b[i];
首先,k应该左移8位而不是4位,因为一个字节是8位
其次,b[i]会先被转化成整型,再进行位或运算。由于0xA0转化成整型是个负数,导致高位为1,如:
预想值: 0000 0000 0000 0000 0000 0000 1010 0000 (4字节)
实际值: 1111 1111 1111 1111 1111 1111 1010 0000 (4字节的整数)
这样计算出来k一定是负值。

正确的写法如下:
k = (k << 8) | (b[i]&0xff);

ctwoz 2011-08-10
  • 打赏
  • 举报
回复
大数BigInteger
zl3450341 2011-08-10
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 f562867448 的回复:]

java 有个BigInteger 类 用来操作高位数
[/Quote]++
Codefans_Fan 2011-08-10
  • 打赏
  • 举报
回复
java 有个BigInteger 类 用来操作高位数

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧