2014-01-24 69 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),以及純小數(沒有前綴)。