我这里的代码很少
int b=3;
b=b >> 1;
System.out.println(b);
它完美地工作,但是当我将变量b更改为byte,short,float,double时它包含错误,但是使用变量int和long它可以完美地工作,为什么它不能与其他变量一起使用?
答案 0 :(得分:7)
位移运算符,例如>>
,与任何整数类型兼容。但是,对于较小类型(如byte
和short
),操作会执行扩展转换:结果会提升为int
类型,因此无法重新分配回源类型。
因此,以下是不合法:
byte b = 3;
b = b >> 1;
但这些作业 合法:
byte b = 3;
b = (byte)(b >> 1)
int c = b >> 1;
至于为什么这些运营商不能使用float
或double
,我会留给您探索。提示:考虑layout of those types in memory以及对位移算子的影响。
答案 1 :(得分:1)
为所有整数类型定义>>
运算符。它没有为float
或double
定义。对于整数类型,结果始终为int
(或long
,如果左操作数为long
)。因此,当您使用byte
或short
时,需要转换回较窄的整数类型来进行分配。
Section 15.19 of the Java Language Specification描述了班次运营商的工作方式。第一步是将一元数字促销应用于操作数; Section 5.6.1 of the JLS中描述了一元数字促销。
答案 2 :(得分:0)
关于迈克的回答,这个问题也存在于其他运营商身上。我们甚至无法编译这个程序
byte b = 3;
b = b + 1; // error
我认为语言设计师在到达这里并走捷径时会有点懒惰。
答案 3 :(得分:0)
最简单的答案是必须为这些类型定义运算符。 bitshift运算符>>和<<没有为他们定义。
这篇文章解释得非常好:
https://stackoverflow.com/a/1723938/2225842
如果我理解正确,Java和C ++都是一样的。