En C99 hay algunos tipos (opcionales) como int8_t , int16_t y similares, que se garantiza que tienen un ancho exactamente especificado y sin bits de relleno, y representan números en complemento a dos (7.18.1.1). En 6.2.6.2, el desbordamiento de enteros con signo se menciona en las notas a pie de página 44) y 45), es decir, que podría resultar en la captura de valores en los bits de relleno .
Como intN_t no tiene bits de relleno, y se garantiza que son complemento de dos, ¿significa esto que su desbordamiento no genera ningún comportamiento indefinido? ¿Cuál sería el resultado de, por ejemplo, una multiplicación desbordante? ¿Qué pasa con la adición? ¿El resultado es módulo reducido 2^N como para tipos sin firmar?
Las notas al pie no son normativas. Si una nota a pie de página indica que el desbordamiento puede generar valores atrapados en bits de relleno, no es realmente incorrecto, pero puedo ver cómo es un poco engañoso. El texto normativo simplemente dice que el comportamiento es indefinido. Colocar valores de captura en bits de relleno es una posible consecuencia de un comportamiento indefinido, pero no la única.
Así que no, esto no significa que el desbordamiento esté definido. Es posible que las operaciones que involucran operandos intN_t / uintN_t se desborden y que ese desbordamiento resulte en un comportamiento indefinido.
Algo así como int8_t i = 127; ++i; no tiene UB. int8_t está sujeto a promociones integrales, por lo que la suma se realiza como si hubieras escrito i = (int8_t) ((int) i + 1); . La adición en sí no se desborda y la conversión de nuevo a int8_t produce un resultado definido por la implementación.
Algo como uint16_t u = 65535; u *= u; tiene UB en implementaciones típicas actuales donde int tiene 32 bits de signo/valor. uint16_t también está sujeto a promociones integrales, por lo que la multiplicación se realiza como si hubieras escrito u = (uint16_t) ((int) u * (int) u); . La propia multiplicación se desborda y el comportamiento no está definido.
Algo así como int64_t i = 9223372036854775807; ++i; tiene UB en casi todas las implementaciones. La adición en sí misma se desborda.
No, no está bien definido porque... no está definido en absoluto. Simplemente no hay texto en el estándar que le dé semántica al desbordamiento de un entero con signo.
No insista demasiado en el término "comportamiento indefinido" como si fuera algo misterioso, pero tómelo en su sentido directo. No hay una definición del comportamiento, por lo que el estándar no especifica nada de lo que debería suceder y ningún código portátil debería depender de tal característica.