C++ · Avançado · Português · Técnico
overflow de inteiro com sinal
Estouro de um int ou outro inteiro com sinal além do máximo ou mínimo do tipo. Em C++ isso é comportamento indefinido, enquanto inteiros sem sinal simplesmente dão a volta.
Onde usar
Aparece em somas e multiplicações de entradas grandes, e o compilador pode assumir que nunca ocorre, removendo verificações como if (x + 1 < x). Ferramentas como o UBSan detectam o problema.
Em código
int m = INT_MAX;
// m + 1; // UB: overflow com sinal
unsigned u = UINT_MAX;
u += 1; // ok: vira 0
if (m < INT_MAX) ++m; // checa antes
// g++ -fsanitize=undefined detectaExemplos
Esse laço pode virar infinito porque o overflow com sinal é indefinido.
Rode com -fsanitize=undefined para pegar overflow de inteiro.
Cuidado
Não presuma que vai dar a volta como no complemento de dois: o otimizador pode transformar o código de formas inesperadas.
Sinônimos
estouro de inteiro