Java中的char
是一种16位数据类型,但在进行算术运算时它是有符号还是无符号的呢?
你能将其作为无符号16位整数用于算术运算吗?
例如,下面的表达式正确吗?
char c1;
char c2;
int i = c1 << 16 | c2;
还是必须先将c2的符号扩展位去掉?
(我确信答案已经在其他地方了,但显然搜索不到。)
Java中的char
是一种16位数据类型,但在进行算术运算时它是有符号还是无符号的呢?
你能将其作为无符号16位整数用于算术运算吗?
例如,下面的表达式正确吗?
char c1;
char c2;
int i = c1 << 16 | c2;
还是必须先将c2的符号扩展位去掉?
(我确信答案已经在其他地方了,但显然搜索不到。)
char
是无符号的。来自JLS§4.2.1:
对于char,范围从'\u0000'到'\uffff',即从0到65535
但请注意,当您对它们使用任何各种数学运算(包括位运算和移位运算)时,它们会根据另一个操作数的类型扩展为另一种类型,并且该其他类型可能是有符号的:
扩大基本类型转换(§5.1.2)的应用是为了根据以下规则将一个或两个操作数进行转换:
如果任何一个操作数是
double
类型,则另一个操作数被转换为double
类型。否则,如果任何一个操作数是
float
类型,则另一个操作数被转换为float
类型。否则,如果任何一个操作数是
long
类型,则另一个操作数被转换为long
类型。否则,两个操作数都被转换为
int
类型。
例如,char + char
是int
类型,因此:
public class Example {
public static void main(String[] args) {
char a = 1;
char b = 2;
char c = a + b; // error: incompatible types: possible lossy conversion from int to char
System.out.println(c);
}
}
所以将char类型零扩展为整数类型T的扩展转换将表示char值的表示零扩展以填充更宽的格式。
char
0xFFFF变成了int
0x0000FFFF,而不是0xFFFFFFFF。