我很困惑为什么会这样,我似乎无法找到答案。这来自作业:
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。
答案 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
备注:强>
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来帮助您中断值。