2009-11-10 73 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