将转换应用于基本类型

时间:2014-11-20 21:12:35

标签: java casting primitive-types

int a=128;
byte b;

b=(byte)a;

System.out.println(b);

这打印-128。

但是在Java书中,相同的代码输出0。

它们之间的区别是什么?

4 个答案:

答案 0 :(得分:0)

128表示为32位整数(int),二进制为00000000 00000000 00000000 10000000

由于byte仅为8位,当它转换为byte时,它变为10000000。因为Java中的所有整数都是使用二进制补码的有符号整数,所以第一位(1)是符号位,因此该值变为-128。

不确定为什么这本书说输出应该是0.你确定这个例子在书中完全相同吗?

有关Java基元类型hereWikipedia的更多信息有一篇关于二元补码的相当全面的文章。

答案 1 :(得分:0)

看,128 = 0x80,所以如果切断所有但不太重要的字节,你将获得1000 0000(二进制)。字节为-128 所以你的java书中有一个错误:)

答案 2 :(得分:0)

在Java中,这应该打印-128。如果a = 256,则应打印0。 字节是从-128到127,所以如果你输出127则是127而128则是-128,因为127 + 1 = -128。

答案 3 :(得分:0)

已经发布了正确的答案,但我很想扩展它。

要更好地了解它的工作原理,请尝试从其他来源了解它。 @DanielGibbs提供的很少,你可以使用

我建议您尝试运行以下代码:

    for (int a = -256; a < 256; a++) {
        byte b = (byte) a;
        System.out.println(a + " -> " + b);
    }

这段代码的输出应该可以让你清楚地看到int中不太重要的含义(以及确定符号的最重要的含义)以及它们如何适合字节类型。

PS。 -256不是10000000 00000000 00000001 00000000,而是11111111 11111111 11111111 00000000