Java char
是16位数据类型,但是在执行算术运算时是带符号的还是无符号的?
您可以在算术运算中将其用作无符号的16位整数吗?
例如,以下正确吗?
char c1;
char c2;
int i = c1 << 16 | c2;
还是有必要先将c2的符号扩展位剥离掉?
(我确定答案是在其他地方,但似乎没有被明显的搜索所发现)。
答案 0 :(得分:2)
char
未签名。来自JLS§4.2.1:
对于字符,从'\ 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
0xFFFF变成int
0x0000FFFF,而不是0xFFFFFFFF。
答案 1 :(得分:0)