最大的Java Short(32767)加1没有变为负数?

Bro*_*lip 7 java binary short twos-complement

最近我学会了在基础二系统中表示正整数和负整数的两种恭维方法.然后,我尝试使用带有以下短代码的java来实现此操作:

int a=2147483647;
System.out.println("a: "+a);
System.out.println("a+1: "+(a+1));
short b=32767;
System.out.println("b: "+b);
System.out.println("b+1: "+(b+1));
Run Code Online (Sandbox Code Playgroud)

哪个输出:

a:2147483647

a + 1:-2147483648

b:32767

b + 1:32768

这让我感到困惑,因为我认为b + 1,以二进制表示为011111111111111,将变为1000000000000000或十进制,-32768.这是怎么回事?

And*_*mas 11

虽然b很短,但表达式(b + 1)是int.右操作数是int,左操作数被提升为int,表达式是操作数的提升类型.

来自Java语言规范,5.6.2.二进制数字促销:

应用扩展基元转换(第5.1.2节)来转换由以下规则指定的一个或两个操作数:

  • 如果任一操作数的类型为double,则另一个操作数转换为double.
  • 否则,如果任一操作数的类型为float,则另一个操作数转换为float.
  • 否则,如果任一操作数的类型为long,则另一个操作数转换为long.
  • 否则,两个操作数都将转换为int类型.

请注意,即使两个操作数都是短类型,也会发生最后一次促销.你不能避免升级到int (b + (short) 1).

15.18.2开始.数值类型的加法运算符(+和 - )

数值操作数上的加法表达式的类型是其操作数的提升类型.

  • 它确实在上面的摘录中描述了这一点,但我要强调的是,`short`操作数被提升为`int`,即使两者都是'short`s'.所以`短a = 32767; 短b = 1; System.out.println(a + b);`仍然会打印`32768`; 这有点令人惊讶,因此值得明确提出. (3认同)