переполнение uint32 и uint64
пишу программу, задался сделать ее кроссплатформенной... язык Си платформа linux/unix ... складываются два числа uint32 или uint64... на форумах пишут что сложение идет по модулю 2^33 и 2^65... вопрос в том всегда ли это так? на всех ли платформах, со всеми ли компиляторами? и как правильно проверять переполнение? (еще видел вариант с проверкой регистров с использованием ассемблера, но тут о кросс платформеннсоти речи не одет...) заранеее спасибо
Если не ошибаюсь, флаги/признаки в принципе не кроссплатформны, а значит проверить переполнение можно только сравнение знаков/модулей исходных чисел и результатов.
Переполнения лучше не допускать, а не проверять.
Цитата: Shiizoo
Если не ошибаюсь, флаги/признаки в принципе не кроссплатформны, а значит проверить переполнение можно только сравнение знаков/модулей исходных чисел и результатов.
А тут смотря что понимать про кросс-платформенностью. Так, флаг переполнения у x86 у всех один - eflags (http://en.wikipedia.org/wiki/FLAGS_register_(computing)) и тут не важно какая ОС. А вот если речь идет о других процессорах (например Sparc, или вообще о каких-нибудь AVR), то тогда вопрос не решается универсально.
я согласен что лучше не допускать) т.е. производить сложение в переменной большей чем исходные переменные? ну т.е. складываем два uint32 результат записываем в uint64 и там уже смотрим было переполнение или нет, и т.д.? но как-то это косячно... заводить новые переменые... интересно как это сделать корректно? или может в конце сложения делать &(2^33-1) что бы обезопасить от переполнения а там уже сравнивать модули...?
или что-нить в роде uint32 a,b,c; c=((uint64)a+(uint64)b)&(2^33 -1)
А если речь идёт об x86,то mike уже всё ответил