算术的Java字符是有符号的还是无符号的?

算术的Java字符是有符号的还是无符号的?,java,char,unsigned,Java,Char,Unsigned,Javachar是一种16位数据类型,但在对其执行算术时,它是有符号的还是无符号的 在算术中,你能把它用作无符号16位整数吗 例如,以下是正确的吗 char c1; char c2; int i = c1 << 16 | c2; charc1; 字符c2; int i=c1从 对于char,从'\u0000'到'\uffff'包括在内,即从0到65535 由于是16位,这意味着它们是无符号的。char是无符号的。发件人: 对于char,从'\u0000'到'\uffff',包括在

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

在算术中,你能把它用作无符号16位整数吗

例如,以下是正确的吗

char c1;
char c2;

int i = c1 << 16 | c2;
charc1;
字符c2;
int i=c1从

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


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

char
是无符号的。发件人:

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

…但请注意,当您对它们使用任何类型(包括按位操作和移位操作)时,它们会根据另一个操作数的类型扩展为另一种类型,而另一种类型很可能是有符号的:

  • 加宽基元转换()用于转换以下规则指定的一个或两个操作数:

    • 如果任一操作数的类型为
      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);
        }
    }
    
    如果我们遵循加宽原语转换,则重新进行位扩展:

    char
    到整数类型T zero的扩展转换扩展了char值的表示,以填充更宽的格式


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

    字符是无符号的,但在位之前提升为intshifting@Michael我假设提升不涉及顶部位的扩展(因为没有符号位)。@r3dst0rm,因为第二个答案在该问题上基本上是错误的(在评论中指出了这一点),我认为这个问题需要澄清(因此提出了这个问题)。谢谢:我感觉数字范围的指定方式(如unicode转义)在文档中,没有明确说明这是如何对字符进行算术处理的。它们的关键问题是加宽是如何发生的。位15是否传播?@rghome-更新了答案的结尾。不,它是0-扩展的。