Шестнадцатеричная запись и целые числа со знаком - PullRequest
11 голосов
/ 26 ноября 2008

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

int ALPHA_MASK = 0xff000000;

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

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

Ответы [ 3 ]

24 голосов
/ 26 ноября 2008

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

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

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

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

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

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

7 голосов
/ 26 ноября 2008

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

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

или

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

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

0 голосов
/ 20 марта 2010

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

-0x7F000000
...