我是PHP的新手,因此花费一些时间/精力来理解类型。然后我遇到了这个:
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的吗?
答案 0 :(得分:4)
32727的二进制表示为0111111111010111
。 byteValue()只是最小的8位,所以11010111
11010111
为负数,因为它以1开头。
取Two's complement(补充每一位,然后加一)得到101001
,即2 ^ 5 + 2 ^ 3 + 2 ^ 0 = 32 + 8 + 1 = 41
所以我们有-41。
答案 1 :(得分:1)
Java只知道签名类型。当你将32727截断为8位(即模256)时,得到215,当解释为带符号的8位数时,它是-41(215 + 41 = 256 = 2 8 )。
签署Byte
类型的选择引起了很多批评,因为它为基本序列化操作增加了许多微妙之处,因此人们通常更喜欢int
类型。