¿Cómo explica que la línea 7 reciba una advertencia, pero no la línea 5 o la línea 6?Tipo de advertencia de conversión después de operaciones bit a bit en C
int main()
{
unsigned char a = 0xFF;
unsigned char b = 0xFF;
a = a | b; // 5: (no warning)
a = (unsigned char)(b & 0xF); // 6: (no warning)
a = a | (unsigned char)(b & 0xF); // 7: (warning)
return 0;
}
GCC 4.6.2 de salida cuando se compila en una arquitectura de 32 bits (PC con Windows):
gcc -c main.c --std=c89 -Wall -Wextra -Wconversion -pedantic
main.c: In function 'main':
main.c:7:11: warning: conversion to 'unsigned char' from 'int' may alter its value [-Wconversion]
Si esto ayuda a entender mi pregunta, aquí es cómo veo esto (probablemente incorrecta!) :
Supongo que en una máquina de 32 bits las operaciones se realizan en números de 32 bits. Dado que unsigned char
cabe en 32-bit int
, el resultado de la operación es 32-bit int
. Pero desde GCC no da advertencias en las líneas 5 y 6, supongo que hay algo más en juego:
línea 5: GCC cifras que (UCHAR) O (UCHAR) nunca es mayor que MAX (UCHAR) , entonces no hay advertencia.
línea 6: GCC calcula que (uchar) Y 0xF nunca es mayor que MAX (uchar), entonces no hay advertencia. El lanzamiento explícito ni siquiera es necesario.
línea 7: Según las suposiciones anteriores: Y no debe dar aviso (ya que la línea 6), O tampoco debe dar aviso (desde la línea 5).
Supongo que mi lógica está defectuosa en algún lugar allí. Ayúdame a entender la lógica del compilador.
Esto parece un error en el compilador: el compilador basado en clang en mac produce una compilación libre de advertencias con la configuración que ha especificado. – dasblinkenlight
Sin advertencia de GCC 4.4.5 en Linux/x86-64. –
¿Alguien puede confirmar que reciben la misma advertencia que yo? – Alex