为啥 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 为基数)数量。
对于一位数字(08
和 09
除外,它们是不允许的),结果是相同的,因此您可能不会注意到它们被解释为八进制。但是,如果您写的数字有多个有效数字,您可能会对结果感到困惑。
例如:
010 == 8
024 == 20
由于八进制字面量通常不是您想要的,因此您应始终注意不要以 0
开头整数字面量,除非您实际上是在尝试自己写零。
【讨论】:
另请注意,错误消息取决于基数:0b3
- binary - “二进制数必须包含至少一个二进制数字”09
- 八进制 - “整数太大:09 " 0xG
- hexadecimal - "十六进制数必须至少包含一个十六进制数字"
很高兴知道。有人可能会用数组 myarray[010] 编写程序,认为它等同于 myarray[10] 并且飞机坠毁或其他什么......
是的,但是如何在八进制中指定零? :)
00
是八进制的 0
。你有十进制、八进制、二进制、十六进制的0 == 00 == 0b0 == 0x0
。正如@Stuart Cook 已经提到的,只要您只有最不常见的单个数字,它们就不会有所不同。【参考方案5】:
在Java
和C/C++
等大多数编程语言中,前导零的数字被解释为octal number。正如我们所知,八进制数仅在 0
到 7
数字内表示。因此像05
,03
,054
这样的数字是有效的,但是像078
,0348
,09
,08
这样的数字往往是无效的。
【讨论】:
【参考方案6】:在 Java 中,如果您定义一个带有前导 '0' 的 int,则表示您在 Octal 中定义一个数字。
int a = 08 给出超出范围的错误,因为在 八进制 中没有任何数字“8”。 八进制仅提供 0-7 数字。
如果你定义 a = 07 那么它不会给出超出范围的错误,因为数字 '0' 和 '7' 在八进制的范围内。
【讨论】:
以上是关于为啥 08 在 Java 中不是有效的整数文字?的主要内容,如果未能解决你的问题,请参考以下文章