Java运算符优先级与移位运算:代码输出20的原因解析
解析Java代码
x << 2-33的执行逻辑及输出结果 先看你给出的代码:
class HelloWorld { public static void main(String[] args) { int x =10; int a = x << 2-33; System.out.println(a); } }
这段代码输出20的核心原因是Java运算符的优先级规则,以及移位操作的特殊处理逻辑,拆解如下:
运算符优先级决定表达式解析顺序
减法(-)的优先级高于左移(<<),所以x << 2-33会被Java编译器解析为x << (2-33),而不是你可能误以为的(x << 2) - 33。计算减法部分
先执行2-33,结果为-31,此时表达式简化为x << -31。移位位数的模运算处理
Java中对int类型(32位有符号整数)进行移位操作时,移位的位数会先对32取模——因为移位超过32位对int类型来说没有意义。-31对32取模的计算过程:-31 = 32*(-1) + 1,所以结果为1,表达式进一步简化为x << 1。执行左移操作
x=10的二进制是1010,左移1位后变为10100,对应十进制的20,这就是最终输出的结果。
如果给x << 2加上括号,表达式变成(x << 2) -33,那就是先算左移得到40,再减33得到7,和当前逻辑完全不同。
内容的提问来源于stack exchange,提问作者NANDISHWAR RAGULA
相关产品推荐
相关产品推荐

