2014-01-24 24 views
0

我观察到,在Java中当我这样做:为什么这发生在int?

public static void main(String[] args){ 
    int i = 45; 
    int j = 045; 

    System.out.println("i:>>"+i); 
    System.out.println("j:>>"+j); 
} 

输出是:

i:>>45 
j:>>37 

为什么发生这种情况?当它是45时,j的值打印为37

有人请指导吗?提前致谢。

+9

前导零意味着该数字被视为八进制数。其基本的任何编程语言都是 – devnull

+0

..任何以0开头的数字都被认为是一个八进制数字 –

回答

7

045是一个八进制(基8):

8^2 * 0 + 8^1 * 4 + 5 = 37 

45是一个十进制(基10)。


尝试运行此:

int j = 049; 
System.out.println("j:>>" + j); 

你会得到“int类型的文字049超出范围”,因为八进制数可以只有从07数字(这是为什么它是基地8)。

编辑:

由于@Gleen在评论中提到,一个十六进制是由0x领先:

int j = 0x111; // 16^2 * 1 + 16^1 * 1 + 1 = 273 
System.out.println("j:>>" + j); 

输出:

j:>>273 
+3

+ 1..cheers for 7k .. :) –

1

如果在Java中使用0前缀一个文字数字,它将被视为八进制值(基数8)。

八进制45等于37基于10

+0

@Downvoter:小心解释? – Keppil

+2

For hex - > 0xABCD123 – Geros

2

Java Language Specification, section 3.10.1

引用:

八进制标记由一个ASCII数字0,接着的ASCII数字0到7穿插用下划线一个或多个 ,并且可以 表示正,零或负的整数。

OctalNumeral: 
    0 OctalDigits 
    0 Underscores OctalDigits 

OctalDigits: 
    OctalDigit 
    OctalDigit OctalDigitsAndUnderscoresopt OctalDigit 

OctalDigit: one of 
    0 1 2 3 4 5 6 7 

OctalDigitsAndUnderscores: 
    OctalDigitOrUnderscore 
    OctalDigitsAndUnderscores OctalDigitOrUnderscore 

OctalDigitOrUnderscore: 
    OctalDigit 
    _ 

就好像你阅读规范,你会发现,Java也支持其他几个整数符号,如十六进制(前缀为0x)和二进制(前缀为0b),以及纯小数(没有前缀)。