Java char 对于算术来说是有符号的还是无符号的?

rgh*_*ome 4 java unsigned char

Javachar是一种 16 位数据类型,但是在对其执行算术时它是有符号的还是无符号的?

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

例如,下面的说法正确吗?

char c1;
char c2;

int i = c1 << 16 | c2;
Run Code Online (Sandbox Code Playgroud)

或者是否有必要先从 c2 中去除符号扩展位?

(我确信这个问题的答案在其他地方,但似乎没有通过明显的搜索找到)。

T.J*_*der 8

char是未签名的。来自JLS\xc2\xa74.2.1

\n
\n

对于char,从\'\\u0000\'到\'\\uffff\'(含),即从0到65535

\n
\n

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

\n
\n
    \n
  1. 加宽基元转换 ( \xc2\xa75.1.2 ) 用于按照以下规则指定转换一个或两个操作数:

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

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

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

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

      \n
    • \n
    \n
  2. \n
\n
\n

例如,char + charint,所以:

\n
public class Example {\n    public static void main(String[] args) {\n        char a = 1;\n        char b = 2;\n\n        char c = a + b;          // error: incompatible types: possible lossy conversion from int to char\n        System.out.println(c);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

关于位扩展,如果我们按照上面的链接来扩大原始转换:

\n
\n

chara到整型 T的加宽转换会对 char 值的表示进行零扩展以填充更宽的格式。

\n
\n

所以char0xFFFF 变成int0x0000FFFF,而不是 0xFFFFFFFF。

\n