int i = 16777215;
void draw(int color) {
}
假设 void draw 期望颜色以 0x 前缀开头,如下所示
draw(0x16777215)
如果我尝试这样做,它会抛出语法错误
draw(0x + i)
Invalid hex literal number
int i 不能包含 0x 部分,需要动态添加
谢谢
0x1234
只是编写整数值的另一种方式。例如,0xff
和255
是完全相同的东西。draw(0x16777215)
和draw(376926741)
是相同的调用。在字节码级别,没有任何区别。唯一的区别是它对阅读代码的人的显示方式;有时用字节来思考更容易,字节很容易用十六进制表示。
如果一个数字以0x
开头,则表示其余的数字被解释为十六进制。而不是0x16777215
,我猜你想要16777215
(没有0x
),这也是0xFFFFFF
。
关于原始数据类型的 Oracle 教程有更多的信息(和比我:)更多的权威)。
为了证明它在引擎盖下都是一样的,你可以看看一些反汇编的代码。考虑这个类:
public class Hexes {
public static int alpha = 0x16777215;
public static int beta = 376926741;
}
编译Hexes.java
后运行javap -c Hexes
将显示后台发生的情况:
Compiled from "Hexes.java"
public class Hexes {
public static int alpha;
public static int beta;
public Hexes();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
static {};
Code:
0: ldc #2 // int 376926741
2: putstatic #3 // Field alpha:I
5: ldc #2 // int 376926741
7: putstatic #4 // Field beta:I
10: return
}
标记为static {}
的块是类的静态初始值设定项,其中设置了alpha
和beta
。请注意,这两个字段(alpha 和 beta)都被分配了相同的 int 值。如果你要编写一个简短的程序来打印出这些值,你会看到每个值都是一样的值:
public class HexesPrinter {
public static void main(String[] args) {
System.out.println(Hexes.alpha);
System.out.println(Hexes.beta);
}
}
输出:
376926741
376926741
只需传递i
. 没有期望以0x
开头的数字的方法这样的东西。 如果它需要一个int
,那么它将取任何int
,指定为十六进制文字,无论是否带有0x
。
另外,要小心。0x16777215
与16777215
数字不同。
我想你需要这个:
Integer.valueOf(String.valueOf(i), 16)
您需要首先了解在 Java 中指定基数 10 和基数 16 数 (hex) 之间的区别。正如其他人所说0x
是一个数字的前缀,表示它以 16 为基数(十六进制)。
在十六进制表示法中指定颜色很有用,因为它们具有组件(Alpha、R、G、B),当您将它们放在基数 10 中时,这些组件并不明显。有关更多详细信息,请参阅此答案:https://stackoverflow.com/a/8633244/1168342