在Java中,为什么从另一个字符减去的字符返回整数

在Java中,为什么从另一个字符减去的字符返回整数,java,int,character,Java,Int,Character,“0123”。字符(0)–“0”返回一个整数。这个整数是什么(为什么是这个整数),通常为什么char=int 为什么是这个整数 因为编译器不能保证操作的结果会产生有效的字符值。由于字符、字节和整数都是隐式可互换的。。。由于整数是三个变量中唯一的一个,它由三个变量的可能值的超集组成。。。默认情况下,转换为整数 @wero在对上述问题的评论中说明了这一点: “0”-“1”是什么字符 也就是说,如果你从一个较低的字符中减去一个较高的字符,那么你将得到一个负数字符。这是无效的。但是,负整数是有效的 或考

“0123”。字符(0)–“0”返回一个整数。这个整数是什么(为什么是这个整数),通常为什么char=int

为什么是这个整数

因为编译器不能保证操作的结果会产生有效的字符值。由于字符、字节和整数都是隐式可互换的。。。由于整数是三个变量中唯一的一个,它由三个变量的可能值的超集组成。。。默认情况下,转换为整数

@wero在对上述问题的评论中说明了这一点:


“0”-“1”是什么字符

也就是说,如果你从一个较低的字符中减去一个较高的字符,那么你将得到一个负数字符。这是无效的。但是,负整数是有效的

或考虑字节…如果将字节250添加到250怎么办?两者都是有效字节,但结果值不是有效字节。(因为它有两个字节宽。)所以需要一个整数来包含它

对于编译器可以保证生成值的常量表达式,可能存在(现在或将来)足够聪明的编译器来维护它。(他们甚至可能会将其优化为编译时常量,以代替代码中的表达式。)例如:

`1` - `0`
int code = 99;
char c = 'c';
int cc = (int) c; //int cc = 99
char sixty_seven = Integer.toString(code).charAt(0); //the char c
然而,如果这样的编译器在使用类似
.charAt()
的东西时默认返回整数,我也不会感到惊讶,因为它不再是一个常量表达式。作为人类,我们可以凭直觉推断出这种表达的持续结果。但是编译器需要严格而简单的规则,引入方法调用会使这些规则变得相当复杂

为什么是这个整数

因为编译器不能保证操作的结果会产生有效的字符值。由于字符、字节和整数都是隐式可互换的。。。由于整数是三个变量中唯一的一个,它由三个变量的可能值的超集组成。。。默认情况下,转换为整数

@wero在对上述问题的评论中说明了这一点:


“0”-“1”是什么字符

也就是说,如果你从一个较低的字符中减去一个较高的字符,那么你将得到一个负数字符。这是无效的。但是,负整数是有效的

或考虑字节…如果将字节250添加到250怎么办?两者都是有效字节,但结果值不是有效字节。(因为它有两个字节宽。)所以需要一个整数来包含它

对于编译器可以保证生成值的常量表达式,可能存在(现在或将来)足够聪明的编译器来维护它。(他们甚至可能会将其优化为编译时常量,以代替代码中的表达式。)例如:

`1` - `0`
int code = 99;
char c = 'c';
int cc = (int) c; //int cc = 99
char sixty_seven = Integer.toString(code).charAt(0); //the char c

然而,如果这样的编译器在使用类似
.charAt()
的东西时默认返回整数,我也不会感到惊讶,因为它不再是一个常量表达式。作为人类,我们可以凭直觉推断出这种表达的持续结果。但是编译器需要严格而简单的规则,引入方法调用会使这些规则变得相当复杂。

因为字符是用int编码的。看

例如:

`1` - `0`
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”。字符(0)–“0”是:从字符串
“0123”
,方法是
charAt(index)
从字符串中获取第一个字符,即
0
。然后我们看看ASCII表,看到0是48。减法后我们得到48-48=0


这是可能的,因为JAVA在很大程度上是基于C语言的,在C语言中没有字符串(字符串是一个对象)。“字符串”可以读取为字符数组。C中的整数和字符在各自的范围内是可互换的(字符是整数类型)。

因为字符是用整数编码的。看

例如:

`1` - `0`
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”。字符(0)–“0”是:从字符串
“0123”
,方法是
charAt(index)
从字符串中获取第一个字符,即
0
。然后我们看看ASCII表,看到0是48。减法后我们得到48-48=0


这是可能的,因为JAVA在很大程度上是基于C语言的,在C语言中没有字符串(字符串是一个对象)。“字符串”可以读取为字符数组。C中的int和char在各自的范围内是可互换的(char是整数类型)。

Java
char
包含一个Unicode/UTF-16代码单元。许多Unicode代码点在其UTF-16编码中只需要一个代码单元,并且这些代码单元的范围很广。因此,在这些范围内,
char
值可被视为码点

char
值之间的减法给出了它们之间的“距离”,这在处理少数“组织良好”的码点序列时非常有用,例如基本拉丁字母(A-Z或A-Z)。知道一个四分之一音符和一个半音符之间的“距离”,或者一张笑脸和一张眨眼的脸之间的“距离”,通常是没有用的

结果是一个整数,因为连续整数列表上的距离是由整数度量的

同样,这种技术只有在非常严格的情况下才有效。总有一种不那么有限的方法可以做到这一点


另请参阅该类的文档。

Java
char
包含一个Unicode/UTF-16代码单元。许多Unicode代码点在其UTF-16编码中只需要一个代码单元,并且这些代码单元的范围很广。因此,在这些范围内,
char
值可被视为码点

char
值之间的减法给出了它们之间的“距离”,这在处理少数“组织良好”的码点序列时非常有用,例如基本拉丁字母(A-Z或A-Z)。知道“d”通常是没有用的