3 * 012 = 30而不是36.为什么?

时间:2014-02-12 06:04:20

标签: java operators

我很困惑为什么会这样,我似乎无法找到答案。这来自作业:

x=1, y=2, z=3;

z=(int)(x/y*3.0+z*012);

System.out.printf("%d %d %d", x, y, z);

答案是:

1 2 30; << from eclipse

我是怎么来到这里的:

(1/2) = 0 * 3.0 = 0 + (z*012)= 30。我想说36但是根据IDE,我想它是30。

4 个答案:

答案 0 :(得分:10)

012是八进制数,不是十进制数,十进制值是10。

z=(int)(x/y*3.0+z*012);

等于 -

z=(int)(1/2*3.0+3*10);
  • 供参考

以0开头的数字是八进制数 以0x开头的数字是十六进制数 数字以0b开头或OB是二进制数。(从Java版本7开始 - Binary Literals

答案 1 :(得分:4)

在Java和其他几种语言中,以0开头的整数文字被解释为八进制(base 8)数量。这里012是一个八进制数,其小数值为f 10

所以你的乘法就像

z = (int) (1/2 * 3.0 + 3 * 10);

来自JLS

  

八进制数字由ASCII数字0后跟一个或多个组成   ASCII数字0到7穿插着下划线,并且可以   表示正整数,零整数或负整数。

答案 2 :(得分:3)

012是八进制,因为它以0开头:

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

因此:

012 * 3 = 10 * 3 = 30

备注:

  • 请记住,八进制是基数为8的数字(十进制数为10),因此不能有大于或等于8的数字。
  • 同样,十六进制数字以0x开头,例如:0x12 = 1*16 + 2 = 18

答案 3 :(得分:2)

请参阅JLS

  

八进制数字由ASCII数字 0后跟一个或多个组成   ASCII数字0到7 穿插着下划线,并且可以   表示正整数,零整数或负整数。

所以,

012 = 0 * 8 2 + 1 * 8 1 + 2 * 8 0 = 10

在Java 7中,您可以使用underscores in numeric literals来帮助您中断值。