4

以下 Java 代码行产生错误。
即使java中的数据类型是签名的?

    char c = -128;  
4

9 回答 9

12

Char 是一种未在 java 中签名的数据类型。它是一个 16 位无符号整数。

于 2012-07-27T14:13:07.940 回答
9

直接来自Java 数据类型的 Oracle 教程。

charchar数据类型是单个 16 位 Unicode 字符。它的最小值为 '\u0000'(或 0),最大值为'\uffff'(或 65,535,包括在内)。

于 2012-07-27T14:13:36.707 回答
4

这是因为 -128 是整数。你需要转换为char。请注意 char 是无符号类型,所以在

   char c = (char) -1;
    System.out.print(Integer.valueOf(c).toString());

你会得到 65535

于 2012-07-27T14:14:27.327 回答
1

它的最小值为'\u0000' (or 0),最大值为'\uffff' (or 65,535 inclusive)

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

于 2012-07-27T14:14:02.433 回答
1

根据 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.
于 2017-04-15T19:10:12.213 回答
0

如果您发现自己对基元的最小值或最大值感到困惑,请找到它们的等效对象并查找 MIN_VALUE 或 MAX_VALUE 常量。例如:

http://docs.oracle.com/javase/6/docs/api/java/lang/Character.html#MIN_VALUE

于 2012-07-27T16:39:49.070 回答
0

投射它:

char c = (char) -128;  

尽管这可能不会像您期望的那样表现。也许一个字节会更好?

于 2012-07-27T14:14:39.903 回答
0

char 保存 16 位无符号值。我们可以将整数分配给 char,但正数最多为 2 的 16 次方,即 65536-1,因为我们从 0 开始。

如果我们需要分配-ve 值,那么一些位将是松散的,我们将需要进行类型转换。在这种情况下,编译器会将符号位与实际值一起存储,最后一位将被丢弃。char c=(char) -128 不会给出编译错误但你会得到荒谬的结果

于 2015-07-19T23:21:52.030 回答
0

您还可以使用以下方法检查 int 值是否作为字符代码有效Character.isValidCodePoint(int codePoint)

boolean isValid = Character.isValidCodePoint(-128); // false

于 2019-06-06T04:54:09.290 回答