在java中显式转换时,short 128 = byte -128如何?

noo*_*ler 0 java byte short type-conversion explicit-conversion

import java.util.Scanner;

public class ShortToByte{
  public static void main (String args[]){
    int i=0;
    while (i<6){
      Scanner sinput = new Scanner (System.in);
      short a = sinput.nextShort();
      byte b = (byte) a;
      System.out.println("Short value : " + a + ",Byte value : " + b);
      i++;
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我试图理解不同数据类型之间的转换,但我很困惑 128 = -128 字节的短值如何以及短值 1000 = -24 字节的值如何?

我一直在使用以下逻辑将 Short 转换为 byte :

十进制 1000 -> 二进制 = 0000 0011 1110 1000

转换为字节时: xxxx xxxx 1110 1000 相当于: 232

我确实注意到正确的答案是二进制值的二进制补码,但是什么时候我们使用二进制补码进行转换,什么时候不使用二进制补码将 3450 从短转换为字节时我没有使用二进制补码但达到了预期的结果。

谢谢你!

rge*_*man 5

您从shortto 的转换byte缩小原始转换。JLS第 5.1.3 节规定:

有符号整数到整型的窄化转换会简单地丢弃除n 个最低位T之外的所有位,其中n是用于表示 type 的位数。除了可能丢失有关数值大小的信息之外,这还可能导致结果值的符号与输入值的符号不同T

(粗体强调我的)

Java 中的数字类型是有符号的。短128,以位表示为

00000000 10000000
Run Code Online (Sandbox Code Playgroud)

缩小为 8 位如下:

10000000
Run Code Online (Sandbox Code Playgroud)

...这是-128。现在该1位不再被解释为+128;现在它是-128,因为二进制补码的工作原理。如果设置了第一位,则该值为负数。

1000 也发生了类似的情况。short 1000,以位表示为

00000011 11101000
Run Code Online (Sandbox Code Playgroud)

缩小为 8 位如下:

11101000
Run Code Online (Sandbox Code Playgroud)

...这是-24