0

我是来自 PHP 的 Java 新手,所以花一些时间/精力来理解类型。然后我遇到了这个:

    Byte bb = new Byte("127");
        System.out.println(bb.byteValue());

    Short ss = new Short("32727");
        System.out.println(ss.shortValue());
        System.out.println(ss.byteValue());

输出 127、32727 和 -41 ?

当 Short 32727 表示为一个字节时,有人可以向我解释它是如何到达 -41 的吗?

4

2 回答 2

4

32727 的二进制表示是0111111111010111. 其中的 byteValue() 只是最小的 8 位,所以11010111

11010111是负数,因为它以 1 开头。

二进制补码(对每个位进行补码,然后加一)给出1010012^5 + 2^3 + 2^0 = 32+8+1 = 41

所以我们有-41。

于 2011-10-02T11:22:17.737 回答
1

Java 只知道有符号类型。当您将 32727 截断为 8 位(即模 256)时,您会得到 215,当解释为带符号的 8 位数字时为 -41(215 + 41 = 256 = 2 8)。

选择Byte签名类型引起了很多批评,因为它为基本的序列化操作增加了很多微妙之处,人们通常int出于这个原因更喜欢这种类型。

于 2011-10-02T11:21:06.327 回答