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编译器的工作,因为这是语言规范所说的它应该做的。