2009-11-10 111 views
10

我正在做非常簡單的int分割,我得到了奇怪的結果。Java int division令我困惑

預期該代碼打印2

public static void main(String[] args) { 
    int i = 200; 
    int hundNum = i/100; 
    System.out.println(hundNum); 
} 

此代碼打印1預期:

public static void main(String[] args) { 
    int i = 0200; 
    int hundNum = i/100; 
    System.out.println(hundNum); 
} 

這到底是怎麼回事?

(視窗XP專業版,爪哇1.6在Eclipse 3.4.1運行)

回答

22

0200是一個八進制(基數爲8)是恆定的。它等於128(十進制)。

Section 3.10.1 of the Java Language Specification來自:

八進制標記由一個ASCII數字0至7,隨後通過一個或多個的ASCII數字0的和可表示正,零或負的整數。

+2

哇,我不敢相信我以前沒有碰到過這個。我覺得自己像個白癡。謝謝! – jjnguy 2009-11-10 04:40:24

+2

我看着你的代表得分,我雖然一定是別的東西! – moogs 2009-11-10 04:43:01

+8

這是基於C語言最令人惱怒的特性之一。我從來沒有見過某人有意使用八進制常數,但我已經看到它多次出現問題。 – 2009-11-10 04:46:55

6

值0200是一個八進制數,它是十進制的。

有關更多信息,請參閱Primitive Data Types說明的文字部分。

1

在這裏觀察到一個有趣的行爲。

如果我做了Integer.parseInt("0200"),我得到200作爲o/p。

Howzzat?!

+2

那麼檢查parseInt的API文檔。它說這一切: public static int parseInt(String s)... 將字符串參數解析爲帶符號的十進制整數。字符串中的字符必須全部爲十進制數字,但第一個字符可能是ASCII減號' - '('\ u002D')表示負值。 – sateesh 2009-11-10 06:25:52

+1

parseInt以10爲基數解析字符串。對Integer.decode的調用將0200解析爲128。 – Salandur 2009-11-10 15:09:13