当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么Java能够将0xff000000存储为int?》经验,为你挑选了3个好方法。

Java中的整数最大值是2147483647,因为Java整数是签名的,对吗?

0xff000000的数值为4278190080.

但我看到Java代码是这样的:

int ALPHA_MASK = 0xff000000;

请问有人可以开导我吗?



1> balu..:

只是埃里克森答案的补充:

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

也就是说,整个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.



2> erickson..:

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

与大多数语言一样,Java以2的补码形式存储带符号的数字.在这种情况下,从0x7F000000或2130706432 减去2 31或2147483648,得到-16777216.



3> Chris Shaffe..:

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

推荐阅读
重庆制造漫画社
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有