为什么在Java中08不是有效的整数字面量?

50
为什么 08 被认为是超出 int 范围,而 07 及以下则不是?

请参见 https://dev59.com/YZTfa4cB1Zd3GeqPOkgl#35521965 相关的编程内容。 - bvdb
请参见前导零的整数 - Andreas
6个回答

74

在Java和其他几种编程语言中,以0开头的整数字面量会被解释为八进制(基数为8)的数值。

对于一位数字(除了不允许的0809),结果是相同的,所以你可能没有注意到它们被解释为八进制。然而,如果你写的数字有多个有效数字,你可能会对结果感到困惑。

例如:

010 ==  8
024 == 20

由于八进制字面量通常不是您想要的,因此,除非您确实试图单独写零,否则始终要注意不要以0开头的整数字面量。


2
还要注意错误信息取决于进制: 0b3 - 二进制 - “二进制数必须至少包含一个二进制数字” 09 - 八进制 - “整数过大:09” 0xG - 十六进制 - “十六进制数必须至少包含一个十六进制数字” - Timmos
很高兴知道这一点。有人可能会编写一个带有数组*myarray[010]的程序,认为它等同于myarray[10]*,然后导致飞机坠毁或其他问题... - Kovács Imre
是的,但是你如何在八进制中指定零呢? :) - Jeffrey Blattman
1
00 是八进制表示的 0。对于十进制、八进制、二进制和十六进制,你有 0 == 00 == 0b0 == 0x0。正如 @Stuart Cook 已经提到的,只要你只有最常见的单个数字,它们就没有区别。 - Zabuzard

15

任何以0开头的数字都被视为八进制。 八进制数只能使用数字0-7,就像十进制可以使用0-9,二进制可以使用0-1一样。

// octal to decimal
01  // 1
02  // 2
07  // 7
010 // 8
020 // 16

// octal to binary (excluding most significant bit)
01  // 1 
02  // 10
07  // 111
010 // 1000 
020 // 10000

了解三进制的人,不了解三进制的人,以及认为这是一个愚蠢笑话的人,总共有10种人。


我不得不在Reddit上搜索很多糟糕的基础笑话才明白,但最终我学会了我属于第十组,那些认为这是个愚蠢笑话的人。 :) - CorayThan

5
Java规范中可以了解到:
八进制数字由ASCII数字0后跟一个或多个ASCII数字0至7组成,可以表示正数、零或负整数。

4
在Java中,如果你使用前导0定义一个int,表示你在定义一个八进制数字。
例如:int a = 08会出现超出范围的错误,因为在八进制中没有数字“8”。八进制只提供0-7这些数字。
如果你定义a = 07,那么它不会出现超出范围的错误,因为数字“0”和“7”都在八进制的范围内。

3

前导零表示这个数值是使用八进制表示的。8并不是一个八进制数字,就像2在二进制或G在十六进制中也是不合法的一样。


2

在大部分编程语言中,比如JavaC/C++,以0开头的数字会被解释为八进制数。我们知道八进制数只能用07这几个数字表示。因此像0503054这些数字是有效的,但是像07803480908这些数字就是无效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接