HardUBтипы
Что такое целочисленное переполнение (overflow) и UB ли оно?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Для знаковых целых переполнение — UB, компилятор имеет право оптимизировать, предполагая, что его нет. Для беззнаковых переполнение определено как wrap-around по модулю 2^n — это не UB.
int max = INT_MAX;
int overflow = max + 1; // UB для signed — непредсказуемо
unsigned int u = UINT_MAX;
unsigned int wrapped = u + 1; // 0 — определено, wrap-around
// Защита от signed overflow:
__builtin_add_overflow(a, b, &result); // GCC/Clang- Для счётчиков, которые могут переполняться, используют
uint*_t; - Санитайзер
-fsanitize=undefinedловит signed overflow.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.