Разделение 64/32 поддерживается непосредственно i386 и, возможно, другими машинами, если высокое слово дивиденда меньше делителя (т. Е. Дивиденд находится в диапазоне 32x32-> 64, умножаясь на делитель). Если ваш компилятор имеет минимальную поддержку для 64-битных типов, он может распознать эту ситуацию и воспользоваться ею.
Предполагая, что вы уже проверили сгенерированный asm и обнаружили, что он не использует это, или если вы знаете, что ваш процессор не имеет такой инструкции разделения, вам просто нужно сделать длинное деление, как вы узнали в классная школа .. кроме этого это база-4294967296 вместо базы-10.
Вы можете попробовать прочитать исходный код до libgcc
, так как он содержит код для разделения 64/64 для машин, у которых нет встроенной поддержки.
Редактировать: На самом деле, поскольку у вас нет операции разделения 64/32, вы можете использовать base-65536. Это связано с тем, что наивное длинное разделение требует деления «двузначного» числа на «1-значный» номер на каждом шаге. Конечно, теперь вы застряли, делая больше шагов.
Если ваши младшие 32-биты равны 0, то в любом случае у вас не останется остатка. – ysap
@ysap: Не верно. Рассмотрим '(1L << 32)/3'. –
Мне любопытно, вы используете 32-битный процессор с разумным _up-to-date_ компилятором C, который не поддерживает 64-битные целые числа? Что это за разочарование? – mctylr