0?o?O?你知道【八进制】喜欢哪一款吗?你熟悉八进制与String的转化吗?

直接数值赋值

众所周知,数值前不加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.<init> (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的八进制字符串表示。
发布了725 篇原创文章 · 获赞 1548 · 访问量 72万+

猜你喜欢

转载自blog.csdn.net/weixin_43896318/article/details/104897595