Я предполагаю, что LLVM использует два дополнения для хранения целых чисел, и в этом случае (подписанное) отрицательное число будет выглядеть как большое число без знака для UDiv (например, представление дополнения двух для 32-битного -1
is 0xFFFFFFFF
).Таким образом, SDiv(-16, 2) == -8
while UDiv(-16, 2) == 2147483640
.
Короче говоря: нет, знак не просто игнорируется для неподписанного.Если вы хотите решить эту проблему, взяв для этого абсолютное значение со знаком.
То, что я могу вывести из здесь , кажется, точные инструкции div - это когда известночто у подразделения нет остатка.Это облегчает оптимизацию.
Далее, как указано здесь ;NSW и NUW означают «No Signed Wrap» и «No Unsigned Wrap», что означает, что значение прерывания генерируется, если происходит перенос (рассмотрим UAdd(-1, -1)
с учетом знаний, полученных выше).