以下 Java 代码行产生错误。
即使java中的数据类型是签名的?
char c = -128;
Char 是一种未在 java 中签名的数据类型。它是一个 16 位无符号整数。
直接来自Java 数据类型的 Oracle 教程。
char
:char
数据类型是单个 16 位 Unicode 字符。它的最小值为'\u0000'
(或 0),最大值为'\uffff'
(或 65,535,包括在内)。
这是因为 -128 是整数。你需要转换为char。请注意 char 是无符号类型,所以在
char c = (char) -1;
System.out.print(Integer.valueOf(c).toString());
你会得到 65535
它的最小值为'\u0000' (or 0)
,最大值为'\uffff' (or 65,535 inclusive)
。
http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html
根据 Oracle Java文档
char:char 数据类型是单个 16 位 Unicode 字符。它的最小值为“\u0000”(或 0),最大值为“\uffff”(或 65,535,包括在内)。
因此,您不能真正将负值分配给char
并将char c = -128
导致错误。
当您尝试将负值分配给 char 并对其进行类型转换时,它将将该值旋转到另一个(最大)端。
char c;
c = (char) 65; // 'A'
c = (char) -100; // 'ワ' and it results in 65,535(inclusive) - 100 = (char) 65,436
c = (char) 65436; // 'ワ'
int i;
i = (char) 65; // 65
i = (char) -1; // 65535 : notice how the char value cycles through the other end
i = (char) -100; // 65436 : same as (char) -100. Here, int returns 65,436.
如果您发现自己对基元的最小值或最大值感到困惑,请找到它们的等效对象并查找 MIN_VALUE 或 MAX_VALUE 常量。例如:
http://docs.oracle.com/javase/6/docs/api/java/lang/Character.html#MIN_VALUE
投射它:
char c = (char) -128;
尽管这可能不会像您期望的那样表现。也许一个字节会更好?
char 保存 16 位无符号值。我们可以将整数分配给 char,但正数最多为 2 的 16 次方,即 65536-1,因为我们从 0 开始。
如果我们需要分配-ve 值,那么一些位将是松散的,我们将需要进行类型转换。在这种情况下,编译器会将符号位与实际值一起存储,最后一位将被丢弃。char c=(char) -128 不会给出编译错误但你会得到荒谬的结果
您还可以使用以下方法检查 int 值是否作为字符代码有效Character.isValidCodePoint(int codePoint)
:
boolean isValid = Character.isValidCodePoint(-128); // false