
[英]In Java, why does type casting of a character to an integer NOT extend the sign bit
[英]Why does a character subtracted from anoter character in Java return an integer [duplicate]
这个问题已经在这里有了答案:
“ 0123” .charAt(0)–'0'返回一个整数。 这个整数是什么(为什么是这个整数),以及通常为什么char-char = int?
为什么这个整数
因为编译器无法保证运算结果会产生有效的字符值。 由于字符,字节和整数都是隐式可互换的...并且由于整数是构成所有三个可能值的超集的三个中的唯一一个,所以默认转换为整数。
@wero在上述问题的评论中对此进行了说明:
'0'-'1'是什么字符?
也就是说,如果您从一个较低的字符中减去一个较高的字符,那么您将拥有一个负字符 。 这是无效的。 但是, 负整数是有效的。
还是考虑一个字节...如果将字节250加上250,该怎么办? 两者都是有效字节,但是结果值不是有效字节。 (因为它是两个字节宽。)因此需要一个整数来包含它。
对于其中编译器可以保证产生值的常量表达式,可能存在(现在或将来)足够聪明的编译器来维护该值。 (他们甚至可能将其优化为编译时常量,以代替代码中的表达式。)例如:
`1` - `0`
但是,即使这样的编译器在使用诸如.charAt()
类的默认值时会默认返回整数,也不会令我感到惊讶,因为它不再是常量表达式。 作为人类,我们可以直观地推断出这种表达的恒定结果。 但是编译器需要严格而简单的规则,而引入方法调用将使这些规则相当复杂。
因为字符是用整数编码的。 请参见ASCII表 。
例如:
int code = 99;
char c = 'c';
int cc = (int) c; //int cc = 99
char sixty_seven = Integer.toString(code).charAt(0); //the char c
“ 0123” .charAt(0)–'0'是:使用方法charAt(index)
从字符串"0123"
中获取字符串中的第一个字符,即0
。 然后,我们查看ASCII表,并看到0为48。然后在减去后得到48-48 = 0。
这是可能的,因为JAVA很大程度上基于C,其中没有String(String是object )。 “字符串”可以读取为char数组。 C中的整数和字符在相应范围内可以互换(字符为整数类型)。
Java char
包含一个Unicode / UTF-16代码单元。 许多Unicode代码点在其UTF-16编码中仅需要一个代码单元,并且这些代码单元范围很广。 因此, 在这些范围内 ,可以将char
值视为一个代码点。
char
值之间的减法给出了它们之间的“距离”,这在处理一些“组织良好”的代码点序列(例如基本拉丁字母(AZ或az))时最有用。 知道四分音符和半音符之间或微笑的脸和眨眼的脸之间的“距离”通常并没有用……。
结果是一个整数,因为连续整数列表上的距离是用整数测量的。
同样,该技术仅在非常严格的情况下才有效。 总是有一种较少受限的方式来做到这一点。
请参阅Unicode代码表 。
另请参见java.lang.Character类的文档。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.