【问题标题】:Why do I get 38528 when casting 10000000 to char?为什么将 10000000 转换为 char 时会得到 38528?
【发布时间】:2019-08-31 23:03:37
【问题描述】:

Java 使用 32 位来表示字符 - 所以最大值是 65536。

但是下面的代码给了我标题中报告的结果。

public static void main(String[] args) {
    int a = 10000000;
    char b = 33;
    b = (char)a;
    System.out.println((int)b);

}

【问题讨论】:

  • 您正在观察溢出。不知道你的预期,崩溃? Java 不会因溢出而崩溃。
  • 您期望获得什么价值,以及为什么您期望得到什么?如果您认为65535,那么您应该阅读Narrowing Primitive Conversion 在Java 中的工作原理。
  • 我想你的意思是 16 位,给出 65536 个可能的值。 32 位给出 4,294,967,296 个可能的值。

标签: java casting integer-overflow


【解决方案1】:

char 是 16 位,而不是 32 位。

65535 是char 的最大值,而10000000 大于此值,因此您不能将该值存储在char 中。

10000000 二进制是100110001001011010000000

现在,当将其转换为 char 时,“适合”的 16 位中剩下的所有位都将被删除,留下 1001011010000000。

十进制的二进制1001011010000000是38528。

【讨论】:

  • 非常感谢!我现在明白为什么这段代码给了我这个结果!
  • 结果是 65536。
  • 我今天开始学习Java,抱歉这个愚蠢的问题:)
  • 这不是一个愚蠢的问题,否则你会投反对票而不是赞成票。这是一个有效且可以理解的初学者问题。假设值被四舍五入而不是二进制位被丢弃是有意义的。不断询问和学习,我们就是这样开始的。
【解决方案2】:

Java 使用 32 位的字符提示

不,Java 使用 16 位 chars。

所以最大值是 65536。

几乎-就char的最大值而言,它是65535,但是2s补码32位值的最大值是231,即@ 987654326@.

但是下面的代码给了我标题中报告的结果。

int a = 10000000;
char b = 33;
b = (char)a;

嗯,10000000 肯定大于65535,不是吗?在尝试将该数字放入char 时,您有什么期望?你得到的是overflow。

【讨论】:

  • "所以最大值是65536"不,最大值是65535。
猜你喜欢
  • 2021-05-07
  • 2018-06-30
  • 2017-06-08
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 2011-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多