缩小java中的类型转换

时间:2017-07-28 10:59:45

标签: java type-conversion

我正在学习Java并且完全是编程新手。我试图了解这段代码中幕后发生的事情:

short c = 234;
byte d = (byte) c;
System.out.println(d);

输出为-22。有人可以解释一下幕后发生的魔法吗?

4 个答案:

答案 0 :(得分:2)

二进制数23411101010‬

虽然这个数字适合8位,但是java中的一个字节是有符号的,所以java中最大可能的字节值是127.当设置最重要(最左边)位时,这意味着"负数&# 34;,所以你获得的数字是负数。

现在,您可能想知道,当-22不是1101010时,您获得的数字为22。通过研究数字的两个补码表示可以找到答案。

以下是维基百科的文章:https://en.wikipedia.org/wiki/Two's_complement

答案 1 :(得分:1)

缩小转换尝试在较窄的表示类型中使用较大的表示类型拟合值 如果具有较大代表类型的值不会溢出较窄的代表类型,没有问题,则值不会发生变化。

例如,对于最大值为127的字节,此代码将使用127对字节变量求值,因为它保持在窄类型的边界内:

short c = 127;
byte d = (byte) c;
System.out.println(d);

否则你有溢出。这是你的实际情况。

例如,尝试使用字节类型溢出1的代码:

short c = 128;
byte d = (byte) c;
System.out.println(d);

byte变量将使用127之后的下一个值进行估值。
但它并不存在。因此JVM在byte范围(-128127)上循环。
它使用byte的最小值:-128

使用short c = 129;,会产生-127等等......

答案 2 :(得分:0)

  

有人可以解释一下幕后发生的魔法吗?

根本没有魔法......检查primitives在java中可以容纳的限制

  

byte:字节数据类型是8位带符号的二进制补码整数。   它的最小值 -128,最大值127 (含)。   字节数据类型可用于在大型数组中保存内存,   记忆储蓄实际上很重要。它们也可以用于   int的位置,其限制有助于澄清您的代码;事实   变量的范围是有限的可以作为一种形式   文档。

所以

short c = 234;

不适合一个字节,这就是你需要cast的原因,负结果值是你在该演员操作后获得的值

答案 3 :(得分:0)

延长@Mike Nakis的答案。字节的值是-128 - 127.通过明确地告诉编译器使用(byte)进行强制转换,您对编译器说不关心范围约束并且无论如何都适合它。

如果你没有使用强制转换,编译器会通过打印来警告你

incompatible types: possible lossy conversion from short to byte