Java char
是一个16位数据类型,但它在执行算术时是否有符号或无符号?
你可以在算术中将它用作无符号16位整数吗?
例如,以下是否正确?
char c1;
char c2;
int i = c1 << 16 | c2;
或者是否有必要首先从c2中剥离符号扩展位?
(我确信这个问题的答案在其他地方,但似乎没有被明显的搜索所吸引)。
char
未签名。来自JLS§4.2.1:
对于char,从'\ u0000'到'\ uffff',包括0到65535
...但请注意,当您对它们使用任何various mathematic operations(包括按位运算和移位运算)时,它们会根据另一个操作数的类型扩展为另一种类型,并且其他类型可能会被签名:
- 应用扩展基元转换(§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);
}
}
重新位扩展,如果我们按照the link above扩展原始转换:
char
到整数类型T的扩展转换为零值扩展了char值的表示以填充更宽的格式。
因此char
0xFFFF变为int
0x0000FFFF,而不是0xFFFFFFFF。