使用哪些变量运算符>>兼容

时间:2013-11-12 22:27:35

标签: java variables

我这里的代码很少

int b=3;
b=b >> 1;
System.out.println(b);

它完美地工作,但是当我将变量b更改为byte,short,float,double时它包含错误,但是使用变量int和long它可以完美地工作,为什么它不能与其他变量一起使用?

4 个答案:

答案 0 :(得分:7)

位移运算符,例如>>,与任何整数类型兼容。但是,对于较小类型(如byteshort),操作会执行扩展转换:结果会提升为int类型,因此无法重新分配回源类型。

因此,以下是合法:

byte b = 3;
b = b >> 1;

但这些作业 合法:

byte b = 3;
b = (byte)(b >> 1)
int c = b >> 1;

至于为什么这些运营商不能使用floatdouble,我会留给您探索。提示:考虑layout of those types in memory以及对位移算子的影响。

答案 1 :(得分:1)

为所有整数类型定义>>运算符。它没有为floatdouble定义。对于整数类型,结果始终为int(或long,如果左操作数为long)。因此,当您使用byteshort时,需要转换回较窄的整数类型来进行分配。

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 ++都是一样的。