Подтвердить что ты не робот

Шестнадцатеричная запись и целые числа со знаком

Это дополнительный вопрос. Итак, Java хранит целые числа в двух дополнениях, и вы можете делать следующее:

int ALPHA_MASK = 0xff000000;

В С# это требует использования целого числа без знака, uint, поскольку оно интерпретирует его как 4278190080 вместо -16777216.

Мой вопрос, как объявить отрицательные значения в шестнадцатеричной записи в С#, и как именно целые числа представлены внутри? Какие отличия от Java здесь?

4b9b3361

Ответ 1

С# (точнее,.NET) также использует два дополнения, но поддерживает как подписанные, так и неподписанные типы (чего нет в Java). Битовая маска, естественно, вещь без знака - почему один бит должен отличаться от всех других битов?

В этом конкретном случае безопасно использовать непроверенное приведение:

int ALPHA_MASK = unchecked((int)0xFF000000);

Чтобы "напрямую" представить это число как значение со знаком, вы пишете

int ALPHA_MASK = -0x1000000; // == -16777216

Шестнадцатеричное не отличается (или не должно) отличаться от десятичного: для представления отрицательного числа необходимо написать отрицательный знак, за которым следуют цифры, представляющие абсолютное значение.

Ответ 2

Ну, вы можете использовать непроверенный блок и бросок:

unchecked
{
    int ALPHA_MASK = (int)0xff000000;
}

или

int ALPHA_MASK = unchecked((int)0xff000000);

Не очень удобно, хотя... возможно, просто использовать буквальное целое?

Ответ 3

И просто добавить оскорбление травмы, это тоже будет работать:

-0x7F000000