Цитата(Genadi Zawidowski @ Jun 25 2010, 23:33)

После аппаратного (или программного) деления и частное и остаток обычно присутствуют в регистрах процессора и структура ldiv_t (div_t) эти самые регистры впрямую и отображает.
Вот именно. Просто всё-таки нужно представлять себе, во что выливается операция
/ или
%, даже если пишешь для x86, как вообще деление реализуется.
Цитата(Genadi Zawidowski @ Jun 25 2010, 23:33)

Так было на x86. На ARM и AVR не интересовался.
Да так же. Только для AVR в библиотеке компилятора есть функции для деления, которые вызываются и для
/,
%, только при этом берётся половина результата. А div просто переназначено на эту функцию, возвращающую на регистрах обе части результата деления.
avr-gcc, stdlib.h
Код
/* __divmodhi4 and __divmodsi4 from libgcc.a */
extern div_t div(int __num, int __denom) __asm__("__divmodhi4") __ATTR_CONST__;
extern ldiv_t ldiv(long __num, long __denom) __asm__("__divmodsi4") __ATTR_CONST__;
Так что применение div и тут в два раза сокращает затраты времени на деление по сравнению с раздельной парой
/,
%. Оптимизатор сам не видит, что можно было бы вызвать еление один раз.
Хотя для данной конкретной задачи для AVR другие способы побыстрее всё равно. Вариант с div,
кажется, немного компактнее для случая, когда деление в программе всё равно есть и __divmod* всё равно линкуются.