Числовой целочисленный литерал по умолчанию равен int
, если только число не слишком велико, чтобы поместиться в int
, и вместо этого оно становится uint
(и т. Д. Для long
и ulong
).
Поскольку значение 0x80000000 слишком велико, чтобы поместиться в int
, это значение uint
. Когда вы используете оператор |
на int
и uint
, оба расширяются до long
, поскольку ни один из них не может быть безопасно преобразован в другой.
Значение может быть представлено как int, но тогда вы должны игнорировать, что оно становится отрицательным значением. Компилятор не будет делать это тихо, поэтому вы должны указать ему значение int
, не заботясь о переполнении:
a = unchecked((int)0x80000000) | a;
(Примечание. Это только указывает компилятору, как преобразовать значение, поэтому для преобразования в int
не создано никакого кода.)