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

Posted

技术标签:

【中文标题】在 java 中显式转换时,short 128 = byte -128 是如何实现的?【英文标题】:How is short 128 = byte -128 while explicit casting in java ? 【发布时间】:2018-03-26 19:42:36 【问题描述】:
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 字节的短值以及 1000 的短值 = -24 字节如何?

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

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

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

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

谢谢!

【问题讨论】:

Java 数据类型是signed(不是unsigned)。 @ElliottFrisch 如果我错了,请纠正我:所以在 1110 1000 中,最高有效位是 1,因此它表示二进制补码 / 负数,因此当我计算时,我应将第一个值视为负数本例:-128 并通过以下方式得到答案:-128 + 64 + 32 +8 = -24 ! 【参考方案1】:

您从shortbyte 的转换是缩小的原始转换。 JLS, Section 5.1.3,声明:

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

(我的粗体强调)

数字类型在 Java 中签名。短 128,以位表示为

00000000 10000000

缩小到8位如下:

10000000

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

1000 也有类似的情况。短 1000,以位表示为

00000011 11101000

缩小到8位如下:

11101000

...这是-24

【讨论】:

【参考方案2】:

来自java datatypes:

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

因此 128 溢出到 -128。

【讨论】:

以上是关于在 java 中显式转换时,short 128 = byte -128 是如何实现的?的主要内容,如果未能解决你的问题,请参考以下文章

在案例查询中显式转换枚举

Java类型转换

在 terraform 模块中显式使用提供程序

在 mvvm 中显式保存

jvm编译器的优化

C#:在实现的方法中显式指定接口