【发布时间】:2012-07-27 14:11:23
【问题描述】:
以下 Java 代码行产生错误。
即使java中的数据类型是签名的?
char c = -128;
【问题讨论】:
-
另外,一个字符是用来表示一个字符的。带负值的char是什么意思?
标签: java
以下 Java 代码行产生错误。
即使java中的数据类型是签名的?
char c = -128;
【问题讨论】:
标签: java
Char 是一种未在 java 中签名的数据类型。它是一个 16 位无符号整数。
【讨论】:
直接来自 Java datatypes. 的 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 doc
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.
【讨论】:
投射它:
char c = (char) -128;
虽然这可能不会像你预期的那样表现。也许一个字节会更好?
【讨论】:
如果您对基元的最小值或最大值感到困惑,请找到它们的等效对象并查找 MIN_VALUE 或 MAX_VALUE 常量。例如:
http://docs.oracle.com/javase/6/docs/api/java/lang/Character.html#MIN_VALUE
【讨论】:
char 保存 16 位无符号值。我们可以将整数分配给 char,但正数最多为 2 的 16 次方,即 65536-1,因为我们从 0 开始。
如果我们需要分配 -ve 值,一些位将是松散的,我们需要进行类型转换。在这种情况下,编译器会将符号位与实际值一起存储,最后一位将被丢弃。 char c=(char) -128 不会给出编译错误但你会得到荒谬的结果
【讨论】:
您也可以使用Character.isValidCodePoint(int codePoint)方法检查int值是否作为字符代码有效:
boolean isValid = Character.isValidCodePoint(-128); // false
【讨论】: