【问题标题】:understanding casting in this program了解这个程序中的铸造
【发布时间】:2011-05-03 10:53:33
【问题描述】:
byte b = 5;
byte c = ~5;

如果用 java 编写此代码会产生无法从 int 转换为 byte 的错误。 如果我这样做了

int c = ~5;

结果为 -6,但我期望为 3。原因是什么,我该如何做才能不达到 3。

【问题讨论】:

  • 你为什么期望 ~5 给 3?

标签: java logic


【解决方案1】:

您得到的是负数而不是正数,因为字节原语(如 short、int、long 等)已签名 - 因此最高有效位被翻转,因此它表示负数(使用 @987654321 @.) 反转一个正数的所有位,它会变成负数(反之亦然。)

也就是说,如果没有,您无论如何都不会得到 3 - 5 在二进制中是 101,这将产生 010(2,而不是 3。)

至于为什么必须将它放入 int 中,这是因为 JLS 声明所有整数算术都有一个“至少”一个 int 的返回类型。这与您执行 byte b = 1+1 的原因相同,即使结果明显适合一个字节,它仍然无法正常工作。

【讨论】:

  • 加法示例不好,因为这个特定示例正确编译(因为1+1 是一个常量表达式)。 byte b = 1; b = 1+b;不会编译。
【解决方案2】:

我不明白这个错误。

00000000 00000000 00000000 00000101 => 5
Applying the "~" operator:
11111111 11111111 11111111 11111010 => -6 in the complement 2.

你冷做的是,但不是很好,只是为了理解问题: 字节 c = (字节) (0xFF) & ~5;

11111111 11111111 11111111 11111010 => -6 
Applying & 0xFF
00000000 00000000 00000000 11111111                                           
Results:
00000000 00000000 00000000 11111010 => 250 
So you cast to byte:
-------- -------- -------- 11111010 => -6

一个简单的: 字节 c = (字节) ~5; 可以解决你的问题。

【讨论】:

    【解决方案3】:

    代码

    byte b = 5;
    

    是简写

    byte b = (byte) 5;
    

    它为您进行转换,因为它是编译器可以在编译时评估的常量表达式。

    还有

    byte b = ~5;
    

    甚至

    final int i = 5;
    byte b = ~i;
    

    编译好。注意:如果i 不是final,则第二行不会编译。


    计算负数与取补加1相同。

    neg(a) = comp(a) + 1 或 -a = ~a + 1 或 ~a = -a - 1

    所以你会认为 ~5 是 -5 - 1 = -6。

    【讨论】:

    • ~5 是一个常量表达式,就像5 一样。
    • 我已将其更改为“非文字”。你会怎么称呼它?
    • 我称之为常量表达式。由于完全相同的原因,它也不需要需要强制转换。
    【解决方案4】:

    5的位表示为00000101 那么 ~5 是 11111010

    它的 2 的补码是 00000110,它是 6 的位表示,11111010 是 -6 的位表示。

    【讨论】:

      猜你喜欢
      • 2015-10-01
      • 1970-01-01
      • 2011-01-19
      • 1970-01-01
      • 2015-05-21
      • 1970-01-01
      • 2012-06-05
      相关资源
      最近更新 更多