2014-01-07 1 views
5
int i = 16777215; 

void draw(int color) { 


} 

Допустим, пустота Жеребьевка ожидает цвет, чтобы начать с префиксом 0x, как такДинамически добавить 0x префикс ИНТ в Java

draw(0x16777215) 

Если я пытаюсь это он выдает синтаксическую ошибку

draw(0x + i) 

Invalid hex literal number 

int i не может содержать 0x часть, ее необходимо динамически добавлять

спасибо

+9

I подумайте, что вы неправильно поняли цель «0x». Это для целых литералов. –

+2

16777215 (десятичный) и 0x16777215 (hex) - ДЕЙСТВИТЕЛЬНО разные значения. Вам нужно выяснить, какой из них вы хотите. – elbuild

ответ

2

Просто пройди i. Нет такой вещи, как метод, который ожидает число, начинающееся с 0x. Если он принимает int, тогда он примет любой int, указанный как шестнадцатеричный литерал с 0x или нет.

Кроме того, будьте осторожны. 0x16777215 - это другое число, чем 16777215.

8

0x1234 - это еще один способ записи целочисленного значения. Например, 0xff и 255 - это точно то же самое. draw(0x16777215) и draw(376926741) - это идентичные вызовы. На уровне байт-кода нет любой разности. Единственное различие заключается в том, как это кажется человеку, читающему код; иногда легче думать в терминах байтов, которые легко выражаются в шестнадцатеричном виде.

Если число начинается с 0x, это означает, что остальная часть цифр интерпретируется как шестнадцатеричная. Вместо 0x16777215, я предполагаю, что вы хотели 16777215 (без 0x), который также является 0xFFFFFF.

Oracle tutorial on primitive datatypes имеет немного больше информации (и больше полномочий, чем я):).

Чтобы показать, что под капотом все равно, вы можете посмотреть на какой-то разобранный код. Рассмотрим этот класс:

public class Hexes { 
    public static int alpha = 0x16777215; 
    public static int beta = 376926741; 
} 

Запуск javap -c Hexes после компиляции Hexes.java покажет вам, что под капотом происходит:

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 установлены. Обратите внимание, что двум полям (альфа и бета) присваивается одинаковое значение int. Если вы должны были написать короткую программу, чтобы напечатать значения, вы увидите то же значение для каждого:

public class HexesPrinter { 
    public static void main(String[] args) { 
     System.out.println(Hexes.alpha); 
     System.out.println(Hexes.beta); 
    } 
} 

Выход:

376926741 
376926741 
+0

Я действительно не понимаю, как разбор кода добавляется к вашему ответу. Вопрос действительно в синтаксисе и семантике Java. Если вам нужны подтверждающие доказательства, напишите программу, которая производит некоторый вывод ... или цитируйте авторитетный источник, например, соответствующую часть учебных пособий Oracle Java или JLS. –

+0

Цель разборки заключалась в том, чтобы показать, что в отношении скомпилированной программы оба значения - это просто 'int 376926741'. Но я тоже добавлю цитату - хорошее предложение. – yshavit

+0

Это должен быть принятый ответ – HaydenKai

1

Я думаю, вам это нужно:

Integer.valueOf(String.valueOf(i), 16) 
+2

Или проще: 'int i = 0x16777215;' ... – assylias

+0

У меня есть строка, такая как String hex = "803BB9FF"; и я хочу скрывать это в int color = 0x803BB9FF, пожалуйста, помогите –

+0

long color = Long.valueOf (hex, 16); // выровнять строку –

0

Прежде всего вам нужно понять разницу между указанием чисел базы 10 и базовых 16 чисел (шестнадцатеричный) в Java. Как указывали другие, 0x является префиксом числа, которое говорит, что оно находится в базе 16 (шестнадцатеричный).

Это полезно для определения цвета в шестнадцатеричном виде, потому что они имеют компоненты (альфа, R, G, B), которые не являются очевидными, когда вы поместите их в базе 10. Смотрите этот ответ для получения более подробной информации: https://stackoverflow.com/a/8633244/1168342