Java char是否已签名或未签名算术?

问题描述 投票:1回答:2

Java char是一个16位数据类型,但它在执行算术时是否有符号或无符号?

你可以在算术中将它用作无符号16位整数吗?

例如,以下是否正确?

char c1;
char c2;

int i = c1 << 16 | c2;

或者是否有必要首先从c2中剥离符号扩展位?

(我确信这个问题的答案在其他地方,但似乎没有被明显的搜索所吸引)。

java char unsigned
2个回答
2
投票

char未签名。来自JLS§4.2.1

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

...但请注意,当您对它们使用任何various mathematic operations(包括按位运算和移位运算)时,它们会根据另一个操作数的类型扩展为另一种类型,并且其他类型可能会被签名:

  1. 应用扩展基元转换(§5.1.2)来转换由以下规则指定的一个或两个操作数: 如果任一操作数的类型为double,则另一个操作数转换为double。 否则,如果任一操作数的类型为float,则另一个操作数将转换为float。 否则,如果任一操作数的类型为long,则另一个操作数将转换为long。 否则,两个操作数都将转换为int类型。

例如,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值的表示以填充更宽的格式。

因此char 0xFFFF变为int 0x0000FFFF,而不是0xFFFFFFFF。


0
投票

来自specs

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

由于它是16位,这意味着它们是无符号的。

© www.soinside.com 2019 - 2024. All rights reserved.