unitarios unarios unario significado programacion operadores operador menos ejemplos droltlift binarios c gcc floating-point type-conversion unary-operator

unarios - combinación de menos unario y conversión flotante



operadores unarios c++ (2)

Esto se debe a un error en GCC: la conversión de tipo ocurre antes de la negación.

El problema parece haber existido por un tiempo. Error 55771 - Negación y conversión de tipo incorrectamente intercambiados

En su segundo ejemplo, la negación ocurre antes de la conversión de tipo. Como tal, ves los resultados esperados.

Considere las siguientes declaraciones de C:

unsigned long x = 1; float a = -x; double b = -x;

Yo esperaría que el término menos unario arroje un valor largo sin signo igual a ULONG_MAX y a y b para establecerse en representaciones de ULONG_MAX de precisión simple y doble, respectivamente.

Este es el resultado que obtengo con gcc 4.4.7 en Linux de 32 bits y con los compiladores Intel y PGI en Linux de 64 bits. Con gcc (versiones probadas 4.4.7, 4.7.2 y 4.8.0, ambas con -O0 y -O2) en Linux de 64 bits, sin embargo, la variable doble b tiene el valor esperado, pero float a se convierte en igual a -1 en lugar.

Por el contrario, las siguientes afirmaciones establecerán tanto a como b las representaciones en coma flotante de ULONG_MAX en todos los compiladores y sistemas que he probado:

unsigned long x = 1; unsigned long y = -x; float a = y; double b = y;

Si utilizo unsigned int en vez de unsigned long, obtengo el resultado esperado en todos los sistemas, también.

¿Es esto algún tipo de comportamiento indefinido o un error del compilador?


Lo que describes es un error del compilador.

(y no hay un comportamiento indefinido en el programa a continuación para excusar al compilador)

unsigned long x = 1; float a = -x; double b = -x;