Re[3]: integer overflow
От: B0FEE664  
Дата: 24.05.11 12:47
Оценка:
Здравствуйте, jyuyjiyuijyu, Вы писали:

J>Здравствуйте, Кодёнок, Вы писали:


Кё>>Здравствуйте, jyuyjiyuijyu, Вы писали:


J>>>что думаете по этому поводу ?


Кё>>Для индексации и адресации используется тип вроде size_t, диапазон значений которого перекрывает максимально возможный размер массива, поэтому никто и не проверяет.

J>если использовать size_t да еще на 64 битной машине то и на переполнение
J>не провериш на 32 битной хоть можно к 64 битам откастить и посмотреть
J>проблема не в типе (как раз наоборот тип 32 битный специально выбран
J>как размер массива его можно и на 32 и на 64 кастингом проверить) а в том что приходится
J>складывать и умножать цифры которые потенциально могут приводить к переполнениям

Мне тоже интересен этот вопрос.
Понятно, что не обязательно иметь тип с удвоенной разрядностью. Можно делать что-то вроде такого:

unsigned int a = ...;
unsigned int b = ...;
...
unsigned int a_half = a / 2;
unsigned int b_half = b / 2;
unsigned int max_half = UINT_MAX / 2;

unsigned int AplusB = 0;

if ( a_half + b_half < max_half )
  // a и b можно складывать
  AplusB = a + b;
else
  // возможно переполнение
  throw ...;


А как правильно ?
И каждый день — без права на ошибку...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.