2008-11-25 71 views

回答

25

最高位为符号位。设置它表示负数:-16777216。

与大多数语言一样,Java以2's complement形式存储带符号的数字。在这种情况下,从0x7F000000或2130706432中减去2 或2147483648产生-16777216。

0

ints用Java签名。

39

只是一个除了埃里克森的回答:

正如他所说的,符号的整数存储为二进制补码,可以在大多数计算机体系结构各自的正值。

即,整个2^32个可能的值被分成两组:一个用于以0开始位正值和一个负值开始用1

现在,假设我们'限于3位数字。让我们安排他们在一个有趣的方式将是有意义的第二:

 000 
    111 001 
110  010 
    101 011 
    100 

您将看到在左侧的所有数字与1位开始,而在右边,他们开始根据我们先前决定宣布前者为负值而后者为正值,我们看到001,010和011是唯一可能的正数,而111,110和101是它们各自的负值。

现在我们如何分别处理顶部和底部的两个数字? 000显然应该是零,而100将是所有没有正面对应物的最低负数。总结:

 000  (0) 
    111 001 (-1/1) 
110  010 (-2/2) 
    101 011 (-3/3) 
    100  (-4) 

您可能注意到,您可以通过否定1(001),并加入1(001)得到它的-1(111)的位模式: 001(= 1) - > 110 + 001 - > 111(= -1)

现在回到你的问题:

0xff000000 = 1111 1111 0000 0000 0000 0000 0000 0000

我们不必在前面加零的进一步因为我们已经达到了32位的最大值。 此外,它显然是一个负数(因为它开始与1位),所以我们现在要计算其绝对值/正副本:

这意味着,我们将采取的

补码
1111 1111 0000 0000 0000 0000 0000 0000 

这是

0000 0000 1111 1111 1111 1111 1111 1111 

然后,我们添加

0000 0000 0000 0000 0000 0000 0000 0001 

并获得

0000 0001 0000 0000 0000 0000 0000 0000 = 16777216 

因此,0xff000000 = -16777216。

+0

@Kitsune(和/或任何人不知道这一点):这是一个很好的解释。阅读它可能需要几次,但我建议您阅读它,直到它真的有意义。 – 2008-11-25 23:47:15

7

一些可能值得指出的东西 - 这个代码并不意味着被用作一个带有数值的整数;目的是作为一个位掩码来过滤掉32位颜色值中的alpha通道。这个变量甚至不应该被认为是一个数字,就像打开高8位的二进制掩码一样。

相关问题