0
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++;
    }
  }
}

我试图了解不同数据类型之间的转换,但我很困惑 128 = -128 in byte 的 short 值以及 1000 in short = -24 in byte 的情况?

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

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

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

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

谢谢!

4

2 回答 2

4

您的转换 from shorttobyte是一个缩小的原始转换JLS 第 5.1.3 节规定:

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

(粗体强调我的)

数字类型是用 Java 签名的。short 128,以位表示为

00000000 10000000

缩小为 8 位,如下所示:

10000000

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

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

00000011 11101000

缩小为 8 位,如下所示:

11101000

...这是-24

于 2018-03-26T19:54:16.830 回答
1

java 数据类型

  • byte:byte 数据类型是一个 8 位有符号二进制补码整数。它的最小值为-128,最大值为127(含)

因此 128 溢出到 -128。

于 2018-03-26T19:51:49.403 回答