C # (точнее, .NET) также использует два дополнения, но поддерживает как подписанные, так и неподписанные типы (чего нет в Java). Битовая маска, естественно, вещь без знака - почему один бит должен отличаться от всех других битов?
В этом конкретном случае безопасно использовать непроверенный актерский состав:
int ALPHA_MASK = unchecked((int)0xFF000000);
Чтобы «напрямую» представить это число как значение со знаком, вы пишете
int ALPHA_MASK = -0x1000000; // == -16777216
Шестнадцатеричное не отличается (или не должно) отличаться от десятичного: для представления отрицательного числа необходимо написать отрицательный знак, за которым следуют цифры, представляющие абсолютное значение.