Java在返回char而不是整数时不会抛出错误



我有一个简单的方法,可以获得两个大小数的幂的最后一个非零值

public static int lastDigit(BigInteger n1, BigInteger n2) {
var power = Math.pow(n1.doubleValue(), n2.doubleValue());
String powerInString = String.valueOf(power);
for (int i = powerInString.length() - 1; i >= 0; i--) {
if (powerInString.charAt(i) != '0') {
System.out.println(powerInString.charAt(i));
return powerInString.charAt(i);
}
}
return powerInString.charAt(powerInString.length() - 2);
}

该方法应该返回一个整数。现在,当我独自编码时,我意识到我返回了一个char检查最后一行,但什么也没发生没有错误或任何东西。我以为IntelliJ会爆炸,但没有。它只是向我返回一个看似随机的数字

例如功率可能是128.0,但返回的值是46这是什么?

因为char一个数字。它是一个无符号16位数字:一个介于0和65535(包括0(之间的值。

让我们试试:

char c = 'a';
int y = c; // this.. works?
System.out.println(y); // this prints.. 97?
System.out.println(c); // Phew, this prints 'a' at least
System.out.println((int) 'a'); // also 97, and.. compiles?

这97是从哪里来的

unicode表。计算机最终是基于位的。用比特我们可以表示数字,用数字我们可以表示字符。哪个数字代表哪个字符?好吧,你告诉我。在过去,答案取决于你购买电脑的国家,或者你安装电脑时配置操作系统的语言。主要是因为尝试用字节以外的任何字符表示字符都太低效了,而字节只覆盖0-255个字符-地球上使用的字符比这更多,因此,德国的计算机有一个数字来表示ü字符,冰岛的计算机有数字来表示Ş,土耳其的计算机有无点i,等等。俄罗斯的计算机完全不同(cyrillic(,现在想象一下中国和日本的计算机。

Unicode通过为所有表设置一个表来解决这个问题。当然,该表比256个条目大得多。

97是字符"a"的unicode表id。

字符"0"的unicode值为48。幸运的是,1是49,依此类推,所以如果要将'5'转换为5,请减去48。这很难记住,除了。。。'0'48,就像0x1016020都是同一个数字,只是写作风格不同。

所以你可以写:

int v = '5' - '0';
System.out.println(v); // Prints 5!

那么为什么System.out.println('a')不打印97呢

因为println是这样编码的。println重载:有很多方法都命名为println,在java中,paramtype实际上是方法名称的一部分。所以你得到了它的char版本,它在unicode表中查找数字,然后打印出来。您仍在将97传递给该方法。只是该方法对传递97的反应是打印"a",而不是打印97(这就是采用intprintln变体所做的(。

那么,如果我的方法返回类型int,为什么我可以返回它呢

根据规范,因为java有无声扩展。任何时候你使用数字类型a,而你实际需要的是数字类型B,但a比B"小"(B可以代表a所能代表的一切,甚至更多(,那么这就不是错误;java只是假设您打算转换它,并为您注入转换:

byte b = 10;
int c = b; // legal.
int c = (int) b; // de-syntax-sugared

假设char表示0-65535,int可以表示-2147483648到+21474833647,则每个char都适合,因此:

char c = 'a'; // legal
c = 97; // so is this.
int d = c; // and so is this

另一种方式则不然:

char c = 'a';
byte b = c; // nope
byte b = (byte) c; // legal

unicode不是比65536个条目大很多吗

是的。字符表示代理项对的一部分。这意味着来自更高层次的任何角色,如表情符号,实际上都会占用2个char值。

相关内容

最新更新