4

可能重复:
09 不被识别,而 9 被识别

只是想知道,当我声明以下内容时:

public static final long __VERSIONCODE = 0L;
public static final long __VERSIONCODE = 9L;

这会起作用,但每当我尝试这个时:

public static final long __VERSIONCODE = 09L;
public static final long __VERSIONCODE = 08235L;

我收到一个错误(在 Eclipse 中):

“long 类型的文字 09L 超出范围。”

所以我认为那是因为它以零开头。

但后来我尝试将第二个数字降低为八:

public static final long __VERSIONCODE = 07235L;

这给了我没有错误。

然后:

public static final long __VERSIONCODE = 07239L;

也给了我一个错误。

所以我真的不明白我可以将哪些值分配给 long 而我不能。为什么我会收到此错误?(其实只是我很好奇,我也可以只用一个String作为我的版本代码)。

另外,我忘了提到使用双精度而不是长整数的行为完全相同。

4

2 回答 2

17

当您将 0 放在整数类型文字前面时,它将解释为表示八进制数。由于“9”不是八进制数的有效数字,这可能就是正在发生的事情。尝试打印出“010L”的(十进制)值,看看是否显示“8”来确认。

注意:不确定 Java 是否这样做,或者这是否纯粹是 Eclipse 的工件。如果是后者,打印出 010L 将显示 10。如果是前者,您会看到 8。如果它只是 Eclipse 的一个工件,您可以通过尝试 01L、02L、...、07L 来确认,这应该都可以工作,并且08L 和 09L 会失败。

于 2013-01-28T16:55:30.590 回答
4

对常量使用前导零表示八进制表示法,仅允许使用数字 0..7。所以如果你使用前导零来制作漂亮的数字,这是一个坏主意,因为它代表的值是不同的。

请参阅http://docs.oracle.com/javase/specs/jls/se5.0/html/lexical.html#3.10.1并注意“八进制数字”。

于 2013-01-28T17:00:06.237 回答