Проблема в том, что 8797942068790
не может быть представлен 32-битным, и, таким образом, C# обрабатывает его как 64-разрядный. Однако вы можете преобразовать обратно (по значению) в 32 бит, используя:
x & ((1L<<32)-1)
Это работает следующим образом. 1L
означает, что вы представляете 1
с использованием 64-разрядного long
. Затем вы перемещаете его налево на 32 места. Это означает, что вы получаете значение, которое только выше максимального числа, представленного с 32
бит. Путем вычитания 1
, все 32 лучших бит один, а все остальные нулю, так: ((1L<<32)-1)
двоичного кода равна:
00000000 00000000 00000000 00000000 11111111 11111111 11111111 11111111
Теперь с помощью побитового &
, вы тем самым маскировать все значения, что не может быть представлен 32 немного.
Так для примера, это означает:
csharp> (8797569417216^909522486)&((1L<<32)-1)
1849046582
(используется в csharp
интерактивной оболочки).
После этого вы можете преобразовать результат в int
или uint
. uint
не имеет знака, и поэтому гарантируется, что значение может быть сохранено в uint
. Однако uint
не может работать с отрицательными номерами.
Вы хотите получить такой же результат? В результате вы ошибаетесь - C# дает правильное значение ... –