算术的Java字符是有符号的还是无符号的?
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',包括在
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-扩展的。