Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

переполнение uint32 и uint64

37K
27 ноября 2011 года
qbikk
40 / / 08.09.2010
пишу программу, задался сделать ее кроссплатформенной... язык Си платформа linux/unix ... складываются два числа uint32 или uint64... на форумах пишут что сложение идет по модулю 2^33 и 2^65... вопрос в том всегда ли это так? на всех ли платформах, со всеми ли компиляторами? и как правильно проверять переполнение? (еще видел вариант с проверкой регистров с использованием ассемблера, но тут о кросс платформеннсоти речи не одет...) заранеее спасибо
287
27 ноября 2011 года
Shiizoo
958 / / 14.03.2004
Если не ошибаюсь, флаги/признаки в принципе не кроссплатформны, а значит проверить переполнение можно только сравнение знаков/модулей исходных чисел и результатов.
4
27 ноября 2011 года
mike
3.7K / / 01.10.2002
Ну вполне логично. 32 бита unsigned. Значит можно хранить от 0 до 2^33-1, 64 бита unsigned Значит можно хранить значение от 0 до 2^65-1.

Переполнения лучше не допускать, а не проверять.
4
27 ноября 2011 года
mike
3.7K / / 01.10.2002
Цитата: Shiizoo
Если не ошибаюсь, флаги/признаки в принципе не кроссплатформны, а значит проверить переполнение можно только сравнение знаков/модулей исходных чисел и результатов.



А тут смотря что понимать про кросс-платформенностью. Так, флаг переполнения у x86 у всех один - eflags (http://en.wikipedia.org/wiki/FLAGS_register_(computing)) и тут не важно какая ОС. А вот если речь идет о других процессорах (например Sparc, или вообще о каких-нибудь AVR), то тогда вопрос не решается универсально.

37K
27 ноября 2011 года
qbikk
40 / / 08.09.2010
я согласен что лучше не допускать) т.е. производить сложение в переменной большей чем исходные переменные? ну т.е. складываем два uint32 результат записываем в uint64 и там уже смотрим было переполнение или нет, и т.д.? но как-то это косячно... заводить новые переменые... интересно как это сделать корректно? или может в конце сложения делать &(2^33-1) что бы обезопасить от переполнения а там уже сравнивать модули...?
37K
28 ноября 2011 года
qbikk
40 / / 08.09.2010
или что-нить в роде uint32 a,b,c; c=((uint64)a+(uint64)b)&(2^33 -1)
7
28 ноября 2011 года
@pixo $oft
3.4K / / 20.09.2006
Эээ…простите,но как в 32х-битной переменной вы собираетесь хранить 33 бита?(аналогично с 64).Моя не понимать:)
А если речь идёт об x86,то mike уже всё ответил
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог