我的理解是带有alpha值示例的RGB值可以是0xffhexcode
。
然而,我无法理解的是0xff0000ff
,一个具有最大alpha值的纯蓝色,是一个大于Integer.MAX_VALUE
的整数值。 Java中的下划线编码如何允许这种情况发生?
答案 0 :(得分:2)
实际上像素的范围是整数最大值的两倍,因为整数是有符号的,像素是无符号整数。所以有些颜色有负整数值。例如。白= -1
答案 1 :(得分:1)
Integer
和System.out.printf( "%x%n", -1 );
已签名,您使用的十六进制表示法是无符号的。
EG尝试这样的事情:
{{1}}
将输出:
FFFFFFFF
答案 2 :(得分:1)
这是一个有趣的问题,归结为整数文字的定义。有关完整参考,请参阅https://docs.oracle.com/javase/specs/jls/se9/html/jls-3.html#jls-3.10.1
上的语言规范问题的关键在于,对于以小数表示的整数文字,您只能表示正整数。使用十六进制文字,您可以表达正面和负面的值。具体而言,如果第一位开启,该值将为负。
引用语言规范:
十进制数字是单个ASCII数字0,表示 整数零,或者由1到9的ASCII数字组成 其次是一个或多个从0到9的ASCII数字穿插 下划线,表示正整数。
十六进制数字由前导ASCII字符0x或组成 0X后跟一个或多个穿插的ASCII十六进制数字 下划线,可以表示正整数,零整数或负整数。
因此准确地说,0xffffffff实际上并不大于Integer.MAX_VALUE,因为它是负的(由于前导位开启)。乍一看,你可以尝试一些看起来不对劲的东西:
System.out.println(Integer.MAX_VALUE == 0x7fffffff);
System.out.println(Integer.MIN_VALUE == 0x80000000);
这两行都会输出true。