JVM 内部如何解释 010 或 0110 编号


为什么Java JVM认为int i = 010或

int i = 0110是八进制值,而不是整数值10或110?

当Java被设计时,C和C++是它最大的竞争对手。Java的设计者希望使Java像C和C++一样,以便精通这些语言的程序员会发现过渡更容易。Java的大部分语法,包括八进制文字,都受到C或C++语法的启发。

八进制值与虚拟机无关。八进制值仅存在于源代码中。转换由编译器执行。

不仅在Java中,这种行为几乎存在于所有编程语言中,如C,C++等。根据编程规范,如果一个数字以 0 为前缀,那么它将被视为八进制数,如果它以 0x 为前缀,那么它将被视为十六进制数。

特别是在Java中,如果你想声明二进制数,那么你必须用0b作为前缀。但是您只能在Java 7 or later(if exists)中使用它。

你不应该混淆javac Java编译做什么和JVM做什么。

javac编译器愚

弄了类似语言的Java规范和约定,将0开头的数字视为八进制,0x为十六进制,在Java 7中0b为二进制。

JVM只看到二进制数而不是文本,因此它不知道您使用的是0100还是0x40或64或0xb1000000,因为数字已被转换。

简而言之,JVM对010没有任何想法,这是javac编译器的工作,因为这是语言规范所说的它应该做的。

最新更新