Re: uint.MaxValue << 32 == 0xFFFFFFFF
От: rameel https://github.com/rsdn/CodeJam
Дата: 15.07.21 17:35
Оценка: 111 (6) +3 -1
Здравствуйте, pugv, Вы писали:

P>А знали ли вы, что в C# сабж?


Это не только в C#.

P>Ну, если быть точным, то UB.

P>И, чсх, это документировано.

Это не UB.

If the type of x is int or uint, the shift count is defined by the low-order five bits of the right-hand operand. That is, the shift count is computed from count & 0x1F (or count & 0b_1_1111)


Вообще-то, так работает процессор, что x86-64, что ARMы, и отражено в доках по архитектуре процессоров — значащие биты только первые 5 (31 бит влево/вправо можно сдвинуть). Вот, тут можешь посмотреть: Sharplab
C.M(Int32, Byte)
L0000: mov eax, ecx
L0002: movzx ecx, dl
L0005: shl eax, cl
L0007: ret


В доках C# отразили только то, что по спекам делает процессор

SAL/SAR/SHL/SHR (x86)
The destination operand can be a register or a memory location. The count operand can be an immediate value or register CL. The count is masked to 5 bits, which limits the count range to 0 to 31.


PS. К тому же смысла сдвигать больше, чем на 31 бит все равно нет. А если уж так сильно хочется в результате получить ноль, то для этого есть куча другая способов добиться этого.
... << RSDN@Home 1.0.0 alpha 5 rev. 0>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.