2

I got little code here

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

It works perfectly, but when I change variable b to byte,short,float,double it contains errors, but with variables int and long it works perfectly, why it doesn't work with other variables?

4

4 回答 4

7

位移运算符,例如 ,>>与任何整数类型兼容。byte但是,对于像and这样的较小类型short,该操作执行扩大转换:结果提升为 type int,因此无法重新分配回源类型。

因此,以下内容是合法的:

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

但是这些分配合法的:

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

至于为什么这些运算符不与floator一起使用double,我将留给您探索。提示:考虑这些类型在内存中的布局以及对位移运算符的影响。

于 2013-11-12T22:30:33.453 回答
1

>>运算符是为所有整数类型定义的。它不是为floator定义的double。对于整数类型,结果始终是 a int(或者long,如果左操作数是 a long)。因此,当您将它与byteor一起使用时short,您需要转换回更窄的整数类型来进行赋值。

Java 语言规范的第 15.19 节描述了移位运算符的工作原理。第一步是对操作数应用一元数字提升;一元数字提升在 JLS 的第 5.6.1 节中进行了描述。

于 2013-11-12T22:30:20.513 回答
0

按照迈克的回答,这个问题也存在于其他运营商身上。我们甚至无法编译这个程序

    byte b = 3;
    b = b + 1;  // error

我认为当他们到达这里并走捷径时,语言设计师有点懒惰。

于 2013-11-12T22:34:56.140 回答
0

最简单的答案是必须为这些类型定义运算符。移位运算符 >> 和 << 没有为它们定义。

这篇文章很好地解释了它:

https://stackoverflow.com/a/1723938/2225842

如果我理解正确,Java 和 C++ 都是一样的。

于 2013-11-12T22:35:13.083 回答