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)?
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