运算符的问题!向高手求救!

麦芽面包 2004-06-22 08:15:00
public class URShift{
public static void main(String[] args) {
int i=-1;
i >>>=10;
System.out.println(i);
long l = -1;
l >>>=10;
System.out.println(l);
short s=-1;
s >>>=10;
System.out.println(s);
byte b=-1;
b >>>=10;
System.out.println(b);
b=-1;
System.out.println(b>>>10);
}
}

这个程序得出的结果怎么是4194303,18014398509481983,-1,-1,4194303
怎么也想不通啊
...全文
143 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
eclipse0016 2004-06-23
  • 打赏
  • 举报
回复
在机器里不都是补码表示吗?
麦芽面包 2004-06-23
  • 打赏
  • 举报
回复
哦明白了,原来-1在JAVA里是用补码表示,怪不得,害我郁闷了好久
麦芽面包 2004-06-23
  • 打赏
  • 举报
回复
那个程序不能于运行啊,显示说找不到MAIN函数?怎么回事呢?
maowu 2004-06-23
  • 打赏
  • 举报
回复
我备考scjp的时候做了一个程序来帮我理解位运算符的含义。也许可以帮到你。

http://www.blogbus.com/blogbus/blog/userfiles/15952/1087961530.zip

运行的时候用javaw就可以了。或者把这个文件的后缀改成jar
麦芽面包 2004-06-23
  • 打赏
  • 举报
回复
原来要加-JAR参数啊,我对命令行参数还不太清楚呵呵,谢谢了!
peterzhong 2004-06-23
  • 打赏
  • 举报
回复
以上问题根本原因在于Java使用补码来表示二进制数和在使用>>>操作符是存在数据转换。

1 Java使用补码来表示二进制数,所以会出现4194303,18014398509481983的结果

在补码表示中,最高位为符号位,正数的符号位为0,负数为1。补码的规定如下:对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为00101010。对负数而 言,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。如-42的补码为1010110 (00101010 按位取反11010101+1=11010110) 用补码来表示数,0的补码是唯一的,都为00000000。(而在原码,反码表示中,+0和-0的表示是不唯一的,可参见相应的书籍)。

2 s >>>=10 存在数据转化,其可理解为 s=(short)(((int)s)>>>10),这是为何出现-1结果的原因
maowu 2004-06-23
  • 打赏
  • 举报
回复
javaw -jar 1087961530.zip
可以运行阿。
apple21 2004-06-23
  • 打赏
  • 举报
回复
学习
guojiafuzhuxi 2004-06-23
  • 打赏
  • 举报
回复
呵呵,有收获
wulemale 2004-06-22
  • 打赏
  • 举报
回复
int -1--->11111.....111(32个1,四字节)无符号右移10位即得00000000001111....111(22个1)即十进制4194303
同样long -1是64个1无符号右移10位即得00000000001111....111(54个1)即十进制18014398509481983

其他的,请看下面thinking in java中的一段话:
对char,byte或者short进行移位处理,那么在移位进行之前会自动转换成int。只有右侧的5个低位才会用到。这样可防止在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java 1.0和Java 1.1特别突出)。它们会自动转换成int类型,并进行右移位。但“零填充”不会发生,所以在那些情况下会得到-1的结果。

62,623

社区成员

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

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