Мне интересно, действительно ли в Visual C ++ нет встроенной функции 128-битного деления?
Существует встроенная функция умножения 64x64 = 128 бит, называемая _umul128()
, которая хорошо соответствует инструкции ассемблера MUL
x64.
Естественно, я предположил, что будет также внутреннее деление 128/64 = 64 бит (моделирование инструкции DIV
), но, к моему удивлению, ни Visual C ++, ни Intel C ++, похоже, не имеют его, по крайней мере, он не указан в intrin.h.
Кто-нибудь может это подтвердить? Я попытался найти имена функций в исполняемых файлах компилятора с помощью команды grep, но не смог найти _umul128
, так что, думаю, я посмотрел не в том месте.
Обновление: по крайней мере, теперь я нашел шаблон umul128
(без ведущего подчеркивания) в c1.dll Visual C ++ 2010. Все остальные встроенные функции перечислены вокруг него, но, к сожалению, нет "udiv128" или тому подобное :( Так кажется, что они действительно «забыли» его реализовать.
Чтобы уточнить: я ищу не только 128-битный тип данных, но и способ разделить 128-битный скалярный int на 64-битный int в C ++. Либо встроенная функция, либо встроенная 128-битная целочисленная поддержка решила бы мою проблему.
Изменить: Ответ отрицательный, в Visual Studio 2010 до 2017 года не было _udiv128
встроенных функций, но они доступны в Visual Studio 2019 RTM.
div
иidiv
вызывают#DE
исключение. Это делает его опасным для использования, если вы не проверитеhigh_half < denominator
или что-то в этом роде. - person Peter Cordes   schedule 31.01.2019