Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/363.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/255.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么Java能够将0xff000000存储为int?_Java_Hex_Int - Fatal编程技术网

为什么Java能够将0xff000000存储为int?

为什么Java能够将0xff000000存储为int?,java,hex,int,Java,Hex,Int,Java中整数的最大值是2147483647,因为Java整数是有符号的,对吗 0xff000000的数值为4278190080 但我看到的Java代码如下: int ALPHA_MASK = 0xff000000; 谁能给我点化一下吗?额外的一位是给标志的 Java整数是高位是符号位。设置它表示负数:-16777216 与大多数语言一样,Java以表单形式存储有符号的数字。在这种情况下,从0x7F000000或2130706432中减去231或2147483648,得到-16777216。整

Java中整数的最大值是2147483647,因为Java整数是有符号的,对吗

0xff000000的数值为4278190080

但我看到的Java代码如下:

int ALPHA_MASK = 0xff000000;

谁能给我点化一下吗?

额外的一位是给标志的


Java整数是

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


与大多数语言一样,Java以表单形式存储有符号的数字。在这种情况下,从0x7F000000或2130706432中减去231或2147483648,得到-16777216。

整数是用Java签名的。

只是对erickson答案的一个补充:

正如他所说,在大多数计算机体系结构中,有符号整数被存储为两个整数对其各自正值的补码

也就是说,整个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=1111111 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。

可能值得指出的是-此代码不打算用作带数值的整数;其目的是作为位掩码,从32位颜色值中过滤alpha通道。这个变量甚至不应该被认为是一个数字,就像一个打开了高8位的二进制掩码一样。

@Kitsune(和/或任何不知道这个的人):这是一个很好的解释。阅读它可能需要几次时间,但我建议你通读一遍,直到它真正有意义为止。