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

时间:2018-03-26 19:42:36

标签: java type-conversion byte short 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++;
    }
  }
}

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

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

1000十进制 - &gt;二进制= 0000 0011 1110 1000

转换为字节时的

:xxxx xxxx 1110 1000,相当于:232

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

谢谢!

2 个答案:

答案 0 :(得分:3)

您从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

答案 1 :(得分:0)

来自java datatypes

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

因此128溢出到-128。