2011-09-13 14 views
5

I han alimentado el siguiente código a través de una herramienta de análisis estático:¿Pueden los paréntesis en C cambiar el tipo de resultado de los operandos de una operación bit a bit?

u1 = (u1^u2); // OK 

u1 = (u1^u2) & u3; // NOT OK 

u1 = (u1^u2) & 10; // NOT OK 

u1 = (u1^u2) & 10U; // NOT OK 

u1 = (unsigned char)(u1^u2) & 10U; // OK 

u1 = (unsigned char)(u1^u2) & u3; // OK 

"OK" significa que la herramienta de análisis estático no se quejó. "NO OK" significa que la herramienta de análisis estático se quejó, alegando que algún operando de una operación bit a bit no es un entero sin signo.

Los resultados de los últimos 2 líneas muestran que los paréntesis están causando ya sea

a. una conversión de tipo real para firmar

b. algo que la herramienta de análisis estático piensa que es un tipo de conversión a firmado

voy a pedir al desarrollador de herramientas de análisis estático sobre (b).

Pero antes de hacerlo, me gustaría saber si tal vez el lenguaje C se sabe que hacer (a)?

Respuesta

6

Nada en C se realiza por debajo de int: por ejemplo, cuando la adición de dos unsigned chars, incluso antes de la adición, los operandos se convierten a int de acuerdo con las promociones predeterminados.

unsigned char u1, u2, u3; 
u1 = 0; 
u2 = 42; 
u3 = u1 + u2; 

En la última línea, primero u1 y u2 se convierten en int, entonces el operador + se aplica para obtener un valor int y luego ese valor se convierte de nuevo en unsigned char (por supuesto, el compilador puede utilizar atajos!)

+0

Gracias @pmg! Dejaré la palabra "paréntesis" en el título de la pregunta porque, aunque ahora sé que son irrelevantes, otros también pueden pensar que son los que están causando el problema, buscar y encontrar esta respuesta. Ahora entiendo que esta buena respuesta es un caso especial de "aprender C reglas enteras de promoción". Muchas referencias por ahí (ahora que sé qué buscar). P.ej. http://tinyurl.com/62fm8yl en stackoverflow, y href = "http://www.lysator.liu.se/c/rat/c2.html#3-2" - una discusión de "preservación y valor sin firmar" conservación". – talkaboutquality

3

Esto se debe a que, en C, el tipo resultante de una operación en dos unsigned char: s es int. La herramienta de análisis estático correctamente (aunque no es muy intuitiva) informa que el & se aplica a un int.