uniones una tipos rangos que matriz matrices imprimir ejemplos declaracion c++ c++11 undefined-behavior integer-overflow

una - ¿El desbordamiento de enteros aún no está definido en C++?



tipos de variables en c++ y sus rangos (3)

Como sabemos, el desbordamiento de entero con signo es un comportamiento indefinido . Pero hay algo interesante en la documentación cstdint C ++ 11:

tipo entero con signo con un ancho de exactamente 8, 16, 32 y 64 bits, respectivamente, sin bits de relleno y utilizando complemento de 2 para valores negativos (proporcionado solo si la implementación es compatible directamente con el tipo)

Ver enlace

Y aquí está mi pregunta: dado que el estándar dice explícitamente que para int8_t , int16_t , int32_t e int64_t los números negativos son complemento de 2, ¿sigue siendo un desbordamiento de estos tipos un comportamiento indefinido?

Editar Revisé los estándares C ++ 11 y C11 y esto es lo que encontré:

C ++ 11, §18.4.1:

El encabezado define todas las funciones, tipos y macros igual que 7.20 en el estándar C.

C11, §7.20.1.1:

El nombre de typedef intN_t designa un tipo de entero con signo con ancho N, sin bits de relleno y una representación de complemento de dos. Por lo tanto, int8_t denota tal tipo de entero con signo con un ancho de exactamente 8 bits.


sigue siendo desbordamiento de estos tipos un comportamiento indefinido?

Sí. Según el Párrafo 5/4 del Estándar C ++ 11 (con respecto a cualquier expresión en general):

Si durante la evaluación de una expresión, el resultado no está matemáticamente definido o no está en el rango de valores representables para su tipo, el comportamiento no está definido . [...]

El hecho de que se utilice una representación complementaria de dos para esos tipos firmados no significa que se utilice el módulo aritmético 2 ^ n cuando se evalúan expresiones de esos tipos.

En lo que respecta a la aritmética sin signo , por otra parte, la Norma especifica explícitamente que (Párrafo 3.9.1 / 4):

Los enteros unsigned , declarados unsigned , obedecerán las leyes del módulo aritmético 2 ^ n donde n es el número de bits en la representación del valor de ese tamaño particular del número entero

Esto significa que el resultado de una operación aritmética sin signo siempre está " matemáticamente definido ", y el resultado está siempre dentro del rango representable; por lo tanto, 5/4 no se aplica. La nota al pie 46 explica esto:

46) Esto implica que la aritmética sin signo no se desborda porque un resultado que no puede ser representado por el tipo de entero sin signo resultante es módulo reducido el número que es uno mayor que el valor más grande que puede representarse por el tipo de entero sin signo resultante.


El hecho de que se defina un tipo para usar la representación complementaria 2s, no implica que el desbordamiento aritmético en ese tipo se defina.

El comportamiento indefinido del desbordamiento aritmético firmado se utiliza para permitir optimizaciones; por ejemplo, el compilador puede asumir que si a > b entonces a + 1 > b también; esto no se cumple en la aritmética sin signo donde la segunda verificación debería llevarse a cabo debido a la posibilidad de que a + 1 se ajuste a 0 . Además, algunas plataformas pueden generar una señal de trampa en el desbordamiento aritmético (consulte, por ejemplo, http://www.gnu.org/software/libc/manual/html_node/Program-Error-Signals.html ); el estándar continúa permitiendo que esto ocurra.


Yo apostaría así.

De la documentación estándar (pg.4 y 5):

1.3.24 comportamiento indefinido

comportamiento para el cual esta Norma Internacional no impone requisitos

[Nota: se puede esperar un comportamiento indefinido cuando esta Norma Internacional omite cualquier definición explícita de comportamiento o cuando un programa usa una construcción errónea o datos erróneos. El comportamiento indefinido permitido va desde ignorar la situación completamente con resultados impredecibles, hasta comportarse durante la traducción o la ejecución del programa de una manera documentada característica del entorno (con o sin la emisión de un mensaje de diagnóstico) hasta terminar una traducción o ejecución (con la emisión de un mensaje de diagnóstico). Muchos constructos erróneos del programa no engendran un comportamiento indefinido; se requiere que sean diagnosticados. - nota final]