为啥 08 在 Java 中不是有效的整数文字?

Posted

技术标签:

【中文标题】为啥 08 在 Java 中不是有效的整数文字?【英文标题】:Why is 08 not a valid integer literal in Java?为什么 08 在 Java 中不是有效的整数文字? 【发布时间】:2011-11-05 08:01:24 【问题描述】:

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

【问题讨论】:

另见***.com/questions/35521278/… 另见Integer with leading zeroes 【参考方案1】:

前导零表示该值为八进制。 8 不是八进制数字,二进制不超过 2 或 G 十六进制有效。

【讨论】:

【参考方案2】:

任何以 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 上用谷歌搜索很多糟糕的基本笑话才能得到它,但最终得知我属于第 10 组,那些认为这是一个愚蠢的笑话的人。 :)【参考方案3】:

来自Java specification:

八进制数字由一个 ASCII 数字 0 后跟一个或多个 ASCII 数字 0 到 7 组成,可以表示正整数、零整数或负整数。

【讨论】:

【参考方案4】:

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

对于一位数字(0809 除外,它们是不允许的),结果是相同的,因此您可能不会注意到它们被解释为八进制。但是,如果您写的数字有多个有效数字,您可能会对结果感到困惑。

例如:

010 ==  8
024 == 20

由于八进制字面量通常不是您想要的,因此您应始终注意不要以 0 开头整数字面量,除非您实际上是在尝试自己写零。

【讨论】:

另请注意,错误消息取决于基数:0b3 - binary - “二进制数必须包含至少一个二进制数字”09 - 八进制 - “整数太大:09 " 0xG - hexadecimal - "十六进制数必须至少包含一个十六进制数字" 很高兴知道。有人可能会用数组 myarray[010] 编写程序,认为它等同于 myarray[10] 并且飞机坠毁或其他什么...... 是的,但是如何在八进制中指定零? :) 00 是八进制的 0。你有十进制、八进制、二进制、十六进制的0 == 00 == 0b0 == 0x0。正如@Stuart Cook 已经提到的,只要您只有最不常见的单个数字,它们就不会有所不同。【参考方案5】:

JavaC/C++ 等大多数编程语言中,前导零的数字被解释为octal number。正如我们所知,八进制数仅在 07 数字内表示。因此像05,03,054 这样的数字是有效的,但是像078,0348,09,08 这样的数字往往是无效的。

【讨论】:

【参考方案6】:

Java 中,如果您定义一个带有前导 '0' 的 int,则表示您在 Octal 中定义一个数字。

int a = 08 给出超出范围的错误,因为在 八进制 中没有任何数字“8”。 八进制仅提供 0-7 数字。

如果你定义 a = 07 那么它不会给出超出范围的错误,因为数字 '0' 和 '7' 在八进制的范围内。

【讨论】:

以上是关于为啥 08 在 Java 中不是有效的整数文字?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 kotlin 不接受文字“-9223372036854775808”(最小 64 位有符号整数)?

为啥使用 == 比较两个整数有时有效,有时无效? [复制]

为啥端口是字符串而不是整数?

为啥在这种情况下只有回溯有效?

为啥文字不是 const (字符串除外)?

在 C++20 中使用 bit_cast 将整数转换为 GLvoid* 是不是有效?