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 подскажет развёрнутый ответ в реальном времени.