非常小的问题,但我很感兴趣。说我有以下代码:
byte b = 123134235;
一个字节只能存储-128到127的数字。考虑到这一点,如果我在'内部'范围内给它值123134235
会发生什么。当我尝试编译代码时,我收到以下错误:
test.java:10: error: possible loss of precision
但是Java编译器究竟在做什么?它只是将值存储为123 ...或?
为我语无伦次的英语道歉,我真的很累(早上5点!)
答案 0 :(得分:1)
你在这里有什么
byte b = 123134235;
是一个常量表达式,其中将尝试缩小基元转换。 The Java Language Specification states
如果类型为,则可以使用缩小的基元转换 变量是byte,short或char,以及常量的值 表达式可以在变量的类型中表示。
值123134235
不能由类型byte
表示,因此编译失败。
答案 1 :(得分:0)
如果将赋值转换为字节,它将溢出,
byte b = (byte) 123134235;
byte u = (byte) (Byte.MIN_VALUE - 1);
byte o = (byte) (Byte.MAX_VALUE + 1);
System.out.printf("b = %d, u = %d, o = %d%n", (int) b, (int) u, (int) o);
u
是下溢的示例(比最小有效字节少1),而o
是溢出的另一个示例(比最大有效字节多1个)。输出是,
b = 27, u = 127, o = -128
这告诉我们byte
的范围是-128到127,而(123134235 % 256)
是27。
答案 2 :(得分:0)
byte b = 123134235;
甚至不会编译:所以除了拒绝编译之外,编译器什么都不做。
在使用Java 7的Eclipse中,我对此声明和初始化收到以下编译错误:
Exception in thread "main" java.lang.Error: Unresolved compilation problem:
Type mismatch: cannot convert from int to byte
答案 3 :(得分:0)
首先byte b = 123134235;
不会在compile time
上进行编译,因为它是int
类型,您无法将int
存储到byte
而不会投射它。
But what is the Java compiler actually doing? Is it just storing the value as 123... or?
它实际上是存储它,但它会从正到负溢出,因为字节只是8位有符号的二进制补码整数。
现在让我们使用modulos
来计算它:
System.out.println(b % Byte.MIN_VALUE);
余数将是 27
的字节的实际值