代码之家  ›  专栏  ›  技术社区  ›  noogler

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

  •  0
  • noogler  · 技术社区  · 6 年前
    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从短到字节转换时那样,我没有使用两个补码,但仍然达到了预期的结果。

    非常感谢。

    2 回复  |  直到 6 年前
        1
  •  4
  •   rgettman    6 年前

    您的演员阵容来自 short byte 是一个 缩小基本转换 。这个 JLS, Section 5.1.3 ,表示:

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

    (粗体强调我的)

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

    00000000 10000000
    

    缩小到8位,如下所示:

    10000000
    

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

    类似的情况也发生在1000人身上。短裤 1000 ,以位表示为

    00000011 11101000
    

    缩小到8位,如下所示:

    11101000
    

    。。。这是 -24

        2
  •  1
  •   Klaimmore    6 年前

    从…起 java datatypes :

    • 字节:字节数据类型是一个8位有符号2的补码整数。最小值为-128,最大值为127(含)

    因此,128溢出到-128。