【问题标题】:Why int j = 012 giving output 10?为什么 int j = 012 给出输出 10?
【发布时间】:2014-05-27 05:15:50
【问题描述】:

在我的实际项目中偶然发生的这里是我修改后的小程序。

我不明白为什么它会输出 10

public class Int
{
    public static void main(String args[])
    {
        int j=012;//accidentaly i put zero 
        System.out.println(j);// prints 10??
    }
}

之后,我放了两个零,输出仍然是 10。

然后我将 012 更改为 0123 现在输出 83?

谁能解释一下原因?

【问题讨论】:

  • 1 是十进制,01 是八进制,0x1 是十六进制,0b1 是二进制(在 Java SE 7 中)编辑:'1' 是字符,"1" 是字符串.
  • 另外,您可能想知道08compilation error
  • @GrijeshChauhan 谢谢您的回复。我宁愿接受您的评论作为答案。 :) 你的解释很完美,链接+1。
  • 因为 Java 中没有十进制文字(base-10)前缀,所以不能以前导零开始十进制值。
  • 它发生在 kotlin 上。我创建了一个带有构造函数的类,名为 class codeCollection(var code:Int = 023){} Int 给了我错误!!。就像“)”不见了。现在我知道问题出在哪里了。

标签: java numbers integer literals


【解决方案1】:

比我把 012 改成 0123 现在输出 83 吗?

因为,它被视为八进制基数 (8),因为该数字的前导是 0。所以,它对应的十进制值为10。

012:

(2 * 8 ^ 0) + (1 * 8 ^ 1) = 10

0123:

(3 * 8 ^ 0) + (2 * 8 ^ 1) + (1 * 8 ^ 2) = 83

【讨论】:

  • 谢谢你,我如何确定它是作为八进制基数还是其他基数?
  • @BhaveshAgarwal :解释得很清楚,因为那个数字前面有 0,所以它被认为是八进制。
  • 感谢 Abimaran。抱歉,我的查询不清楚。我打算问我们“一般”如何确定一个数字是否在哪个基数中。就像从 0 开始的数字将是八进制一样,“x”将是十进制,“y”将是等等等等……只是想了解识别所有重要/著名碱基的基础知识。
  • 只是为了让一些试图计算上述操作的人清楚,应该有:3 * 8 ^ 0 + 2 * 8 ^ 1 + 1 * 8 ^ 2
  • @BhaveshAgarwal 如果我理解正确,您要求数字的文字前缀。 Java 支持八进制、十六进制、十进制和二进制。我们可以通过添加0 prefix 来表示Octal 数字。通过将0x prefix 添加到Hexadecimal 号码。我们don’t add any prefix,该号码被视为decimal 号码。在 Java 7 中,我们有一个新的文字前缀来表示 binary base,即 0b prefix。阅读:rodrigosasaki.com/2013/06/10/number-literals-in-java
【解决方案2】:

前导零表示该数字被解释为octal,而不是十进制。

【讨论】:

  • 0 是什么?八进制还是十进制?
  • @GrijeshChauhan 没关系。 0 表示 nothing 在两个碱基中。
  • @The6P4C 我对形式理论非常感兴趣。所以这对我来说很重要 :) 无论如何,Java 中的 0 是十进制,八进制 00 是零,同样在十六进制中 0x0 是零。 (进一步如果你知道 C++ 0 被解释为八进制)
  • @GrijeshChauhan 但是,它们都是等价的,所以得到的数字是一样的。
  • @The6P4C 是的,你是对的,量级上两者是等价的,但语义不同。
【解决方案3】:

您正在使用 int 类型常量的八进制表示将常量分配给变量。因此,编译器通过使用此算法 0*8^0 + 1+8^1 = 10 将整数值从八进制表示 010 转换为十进制表示,然后将 j 分配给 10。请记住,当您看到一个常量开始时0 是八进制表示的整数。即 0111 不是 101 而是 1*8^0 + 1*8^1 + 1*8^2。

【讨论】:

    【解决方案4】:

    如果数字以 0 开头,则该数字被解释为八进制数,而不是十进制数。八进制值以 8 为底,十进制以 10 为底。

    System.out.println(012):
    (2 * 8 ^ 0) + (1 * 8 ^ 1) = 10
    12 = 2*8^0 + 1*8^1 ---> 10
    
    
    System.out.println(0123)
    (3 * 8 ^ 0) + (2 * 8 ^ 1) + (1 * 8 ^ 2) = 83
    123 = 3*8^0 + 2*8^1 + 1*8^2 ---> 83
    

    【讨论】:

      【解决方案5】:

      通过在数字前面放置一个零是八进制形式的整数。 010 是八进制形式,所以它的值为 8

      你自己猜这个程序的输出:

       public class sol{
             public static void main(String[] args){
                   int p = 010;
                   int q = 06;
                   System.out.println(p);
                   System.out.println(q);
             }
       }
      

      输出是:

      8
      6
      

      【讨论】:

        猜你喜欢
        • 2019-04-22
        • 1970-01-01
        • 1970-01-01
        • 2020-08-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-17
        • 1970-01-01
        相关资源
        最近更新 更多