Java字符是带符号的还是无符号的算术运算?

时间:2019-02-28 10:55:37

标签: java char unsigned

Java char是16位数据类型,但是在执行算术运算时是带符号的还是无符号的?

您可以在算术运算中将其用作无符号的16位整数吗?

例如,以下正确吗?

char c1;
char c2;

int i = c1 << 16 | c2;

还是有必要先将c2的符号扩展位剥离掉?

(我确定答案是在其他地方,但似乎没有被明显的搜索所发现)。

2 个答案:

答案 0 :(得分:2)

char未签名。来自JLS§4.2.1

  

对于字符,从'\ u0000'到'\ uffff'(包括0到65535)

...但是请注意,当您在它们上使用任何various mathematic operations(包括按位运算和移位运算)时,它们会根据另一个操作数的类型以及其他类型可能已签名:

  
      
  1. 通行基元转换(§5.1.2)用于转换以下规则指定的一个或两个操作数:

         
        
    • 如果其中一个操作数的类型为double,则另一个将转换为double

    •   
    • 否则,如果其中一个操作数的类型为float,则另一个将转换为float

    •   
    • 否则,如果其中一个操作数的类型为long,则另一个将转换为long

    •   
    • 否则,两个操作数都将转换为类型int

    •   
  2.   

例如,char + charint,所以:

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)

specs

  

对于char,从'\u0000''\uffff'(包括0到65535)

因为它是16位,所以它们是无符号的。