Java整数除法让我感到困惑

9

我正在进行非常简单的整数除法,但结果却是奇数。

以下代码按预期输出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);
}

这里到底在发生什么?

(Windows XP Pro, Java 1.6 在 Eclipse 3.4.1 中运行)

3个回答

21

数值0200是一个八进制(基数为8)的常量,相当于十进制的128。

根据Java语言规范第3.10.1节

一个八进制数字由ASCII数字0后跟一个或多个ASCII数字0到7组成,可以表示正数、零或负整数。


2
哇,我简直不敢相信我以前从没遇到过这个。感觉自己像个白痴。谢谢! - jjnguy
2
我看了你的声望分数,觉得一定有什么不同寻常的地方! - moogs
8
这是C语言的最令人烦恼的特性之一。我从未见过有人故意使用八进制常量,但我已经多次看到它引起问题。 - Mark Bessey
2
这是奥卡姆剃刀原理的一个例子。通常最简单的解决方案是最好的。 - jjnguy
2
我唯一有意使用八进制常量的时候是在 C 的 mkdir() 函数中。 - Greg Hewgill

6

数值0200是一个八进制数,在十进制中为128

更多信息,请参见原始数据类型的字面量部分。


1

这里观察到一个有趣的行为。

如果我执行 Integer.parseInt("0200"),我会得到 200 作为输出。

这是怎么回事?!


2
好的,查看 parseInt 的 API 文档即可了解所有信息:public static int parseInt(String s) ...将字符串参数解析为有符号的十进制整数。该字符串中的字符必须全部为十进制数字,但第一个字符可以是 ASCII 减号 '-' ('\u002D') 表示负数。 - sateesh
1
parseInt将一个以10进制表示的字符串解析为整数。调用Integer.decode可以将0200解析为128。 - Salandur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接