如果我超过Java中变量的限制会发生什么?

时间:2014-08-06 03:48:02

标签: java numbers byte

非常小的问题,但我很感兴趣。说我有以下代码:

byte b = 123134235;

一个字节只能存储-128到127的数字。考虑到这一点,如果我在'内部'范围内给它值123134235会发生什么。当我尝试编译代码时,我收到以下错误:

test.java:10: error: possible loss of precision

但是Java编译器究竟在做什么?它只是将值存储为123 ...或?

为我语无伦次的英语道歉,我真的很累(早上5点!)

4 个答案:

答案 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

的字节的实际值