ulong mixed = (ulong)high << 32 | low;
Состав очень важен. Если вы опустите приведение, учитывая тот факт, что high
имеет тип uint
(что составляет 32 бита), вы будете сдвигать 32-битное значение на 32 бита влево. Операторы сдвига 32-битных переменных будут использовать сдвиги на right-hand-side
mod 32. Фактически, смещение uint
32 бит влево - это неоперация . Приведение к ulong
предотвращает это.
Проверить этот факт легко:
uint test = 1u;
Console.WriteLine(test << 32); // prints 1
Console.WriteLine((ulong)test << 32); // prints (ulong)uint.MaxValue + 1