Шестнадцатеричная запись и целые числа со знаком
Это дополнительный вопрос. Итак, Java хранит целые числа в двух дополнениях, и вы можете делать следующее:
int ALPHA_MASK = 0xff000000;
В С# это требует использования целого числа без знака, uint
, поскольку оно интерпретирует его как 4278190080
вместо -16777216
.
Мой вопрос, как объявить отрицательные значения в шестнадцатеричной записи в С#, и как именно целые числа представлены внутри? Какие отличия от Java здесь?
Ответы
Ответ 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