直接数值赋值
众所周知,数值前不加0,所以八进制数的表示要求开头加0,注意不是o或者O。 比如0123,直接赋值,对应的其实是十进制数83。
jshell> int a = 0123;
a ==> 83
来自字符串的转型
但字符串的强制转型则截然不同。 我们的数值串可能以0开头,比如下面的串"0123":
jshell> String b = "0123";
b ==> "0123"
直接转型,发现只是把0消去了而已,还是妥妥的十进制。 理由是:Integer.parseInt()默认十进制。
jshell> int c = Integer.parseInt(b);
c ==> 123
那怎么转八进制呢?显然是加上radix参数的啦,参数值就是8。
jshell> int d = Integer.parseInt(b, 8);
d ==> 83
你以为决定能转成八进制是因为b是"0123"?其实不是,任意数就可以,没必要有先导0的:
jshell> b = "123";
b ==> "123"
jshell> int d = Integer.parseInt(b, 8);
d ==> 83
printf()输出八进制
这个部分该使用%0还是%o呢?
先看看%0吧!
jshell> System.out.printf("%0", a);
| 异常错误 java.util.UnknownFormatConversionException:Conversion = '0'
| at Formatter.checkText (Formatter.java:2732)
| at Formatter.parse (Formatter.java:2718)
| at Formatter.format (Formatter.java:2655)
| at PrintStream.format (PrintStream.java:1053)
| at PrintStream.printf (PrintStream.java:949)
| at (#4:1)
明显在扯皮……%0什么鬼啊。。。
所以要用%o,打印出的结果就是八进制的啦!(%d是十进制整数)
jshell> System.out.printf("%o", a);
123$5 ==> java.io.PrintStream@65e2dbf3
jshell> System.out.printf("%o", c);
173$6 ==> java.io.PrintStream@65e2dbf3
jshell> System.out.printf("%d", a);
83$7 ==> java.io.PrintStream@65e2dbf3
大O行吗?
jshell> System.out.printf("%O", c);
| 异常错误 java.util.UnknownFormatConversionException:Conversion = 'O'
| at Formatter$FormatSpecifier.conversion (Formatter.java:2839)
| at Formatter$FormatSpecifier. (Formatter.java:2865)
| at Formatter.parse (Formatter.java:2713)
| at Formatter.format (Formatter.java:2655)
| at PrintStream.format (PrintStream.java:1053)
| at PrintStream.printf (PrintStream.java:949)
| at (#7:1)
显然不行啊!
八进制回转String注意前面已经定义了a的值是0123,即83。 那么同样可以使用 Integer.toString() 中的radix来破解,radix置为8即可。
jshell> String e = Integer.toString(a, 8);
e ==> "123"
结果不带先导0。
总结有关八进制的使用,大概可以这么做一下归纳:
- 八进制用的不多,不如二进制、十进制、十六进制广泛。
- 八进制直接赋值要加先导0,但显示出来的还是十进制的值,底层还是二进制在运算,八进制没实际意义。注意这里不是o或者O,是0。
- 八进制使用printf()打印的时候用的是"%o",不是O或者0。
- 将String转换成八进制数的时候,使用Integer.parseInt(),指明radix即可,结果还是十进制(显示)/二进制(底层)表示的。注意String不必加先导0。
- 八进制数转成String的时候,使用逆向的Integer.toString(),指明radix即可,结果就是不带先导0的八进制字符串表示。