Здравствуйте, 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 ...;
А как правильно ?