Java中的整数最大值是2147483647,因为Java整数是签名的,对吗?
0xff000000的数值为4278190080。
然而我看到这样的Java代码:
int ALPHA_MASK = 0xff000000;
有人可以开导我吗?
答案 0 :(得分:40)
只是埃里克森回答的补充:
正如他所说,在大多数计算机体系结构中,有符号整数被存储为它们各自正值的两个补码。
也就是说,整个2 ^ 32个可能的值被分成两组:一组用于从0位开始的正值,一组用于以1开始的负值。
现在,想象一下我们只限于3位数字。让我们以一种有趣的方式安排它们,这将在一秒钟内有意义:
000
111 001
110 010
101 011
100
你看左边的所有数字都以1位开头,而右边的数字则以0开头。我们之前决定宣布前者为负数,后者为正数,我们看到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。
答案 1 :(得分:25)
高位是符号位。设置它表示负数:-16777216。
与大多数语言一样,Java以2's complement形式存储带符号的数字。在这种情况下,从0x7F000000或2130706432减去2 31 或2147483648,得到-16777216。
答案 2 :(得分:7)
可能值得指出的东西 - 这段代码不能用作带数值的整数;目的是作为位掩码从32位颜色值中过滤掉alpha通道。这个变量实际上甚至不应该被认为是一个数字,就像打开高8位的二进制掩码一样。
答案 3 :(得分:1)
额外的位用于符号
Java整数是twos complement
答案 4 :(得分:0)
ints用Java签名。