【发布时间】:2017-10-06 02:08:56
【问题描述】:
我的理解是带有 alpha 值的 RGB 值示例可能是 0xffhexcode。
但是,我无法理解0xff0000ff,一个具有最大 alpha 值的纯蓝色,是一个大于 Integer.MAX_VALUE 的整数值。 Java 中的下划线编码是如何允许这种情况发生的?
【问题讨论】:
我的理解是带有 alpha 值的 RGB 值示例可能是 0xffhexcode。
但是,我无法理解0xff0000ff,一个具有最大 alpha 值的纯蓝色,是一个大于 Integer.MAX_VALUE 的整数值。 Java 中的下划线编码是如何允许这种情况发生的?
【问题讨论】:
实际上像素的范围是整数最大值的两倍,因为整数是有符号的,而像素是无符号整数。所以有些颜色有负整数值。例如。白色 = -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);
两行都会输出真值。
【讨论】:
int 和 Integer 是有符号的,你使用的十六进制符号是无符号的。
EG 试试这样的:
System.out.printf( "%x%n", -1 );
将输出:
ffffffff
【讨论】: