Todas las operaciones en tipos enteros con signo "estándar" en C (short, int, long, etc.) muestran un comportamiento indefinido si arrojan un resultado fuera del intervalo [TYPE_MIN, TYPE_MAX] (donde TYPE_MIN, TYPE_MAX son el mínimo y el máximo .. valor entero respectivamente que puede ser almacenada por el tipo entero específico¿Los tipos enteros con signo C99 definidos en stdint.h presentan un comportamiento bien definido en caso de desbordamiento?
Según el estándar C99, sin embargo, todos los tipos intN_t
están obligados a tener representación de complemento a dos:
7.8.11.1 exacta- ancho entero tipos
1. El typedef nombre intN_t designar s un tipo entero con signo con ancho N, sin relleno bits, y una representación complementaria de dos. Por lo tanto, int8_t denota un entero con signo con un ancho de exactamente 8 bits.
¿Esto significa que los tipos intN_t
en C99 muestran un comportamiento bien definido en caso de un desbordamiento de número entero? Por ejemplo, ¿este código está bien definido?
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main(void)
{
printf("Minimum 32-bit representable number: %" PRId32 "\n", INT32_MAX + 1);
return 0;
}
¿Se menciona esto implícita o explícitamente en algún lugar de la norma? – Alexandros
6.5p5, que cité, lo menciona explícitamente. Nada más en la norma dice que implica que 6.5p5 no se aplica a los tipos 'intN_t'. Y nada en el estándar define el comportamiento envolvente común para los tipos de complementos de 2; para que el comportamiento se defina, el estándar debería definirlo en alguna parte. –
"Esto no afecta a los tipos sin signo porque ..." ¿No debería calificarse esto como tipos sin signo más estrecho que 'int' se promueven a' int' (y no 'sin firmar') primero y luego sufren las mismas limitaciones de comportamiento? – chux