【问题标题】:Java int division confusing meJava int 部门让我感到困惑
【发布时间】:2010-12-14 21:46:37
【问题描述】:

我正在做非常简单的 int 除法,结果很奇怪。

此代码按预期打印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 中运行)

【问题讨论】:

    标签: java int division octal


    【解决方案1】:

    0200 是一个八进制(以8 为底)常量。它等于 128(十进制)。

    来自Section 3.10.1 of the Java Language Specification

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

    【讨论】:

    • 哇,我不敢相信我以前没有遇到过这种情况。我觉得自己像个白痴。谢谢!
    • 我看了你的代表分数,但我认为它一定是别的东西!
    • 这是基于 C 语言的最令人讨厌的特性之一。我从未见过有人故意使用八进制常数,但我已经看到它多次导致问题。
    • 这是一个奥卡姆剃刀的案例。这通常是最简单的解决方案。
    • 我唯一一次故意使用八进制常量是在 C mkdir() 函数中。
    【解决方案2】:

    值0200是八进制,十进制为128

    有关详细信息,请参阅Primitive Data Types 说明的文字部分。

    【讨论】:

      【解决方案3】:

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

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

      怎么样?!

      【讨论】:

      • 请检查 parseInt 的 API 文档。它说明了一切: public static int parseInt(String s) ... 将字符串参数解析为有符号十进制整数。字符串中的字符必须都是十进制数字,除了第一个字符可能是 ASCII 减号 '- ' ('\u002D') 表示负值。
      • parseInt 解析基数为 10 的字符串。调用 Integer.decode 解析 0200 到 128。
      猜你喜欢
      • 2016-07-29
      • 1970-01-01
      • 2020-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多