我正在学习Java并且完全是编程新手。我试图了解这段代码中幕后发生的事情:
short c = 234;
byte d = (byte) c;
System.out.println(d);
输出为-22。有人可以解释一下幕后发生的魔法吗?
答案 0 :(得分:2)
二进制数234
为11101010
。
虽然这个数字适合8位,但是java中的一个字节是有符号的,所以java中最大可能的字节值是127.当设置最重要(最左边)位时,这意味着"负数&# 34;,所以你获得的数字是负数。
现在,您可能想知道,当-22
不是1101010
时,您获得的数字为22
。通过研究数字的两个补码表示可以找到答案。
答案 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
范围(-128
到127
)上循环。
它使用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