Normalmente, C requiere que los operandos de un operador binario se promuevan al tipo del operando de mayor rango. Esto puede ser explotado para evitar llenar código con moldes detallados, por ejemplo:Bitshift y la promoción de enteros?
if (x-48U<10) ...
y = x+0ULL << 40;
etc.
Sin embargo, he encontrado que, al menos con gcc, este comportamiento no funciona para bitshifts. Es decir.
int x = 1;
unsigned long long y = x << 32ULL;
yo esperaría que el tipo del operando de la derecha para hacer que el operando de la izquierda para ser promovidos al unsigned long long
para que el cambio tenga éxito. Pero en cambio, impresiones de gcc una advertencia:
warning: left shift count >= width of type
es GCC roto, o es el estándar de hacer alguna excepción a las reglas de la promoción Tipo de bitshifts?
¿Promocionará de todos modos, independientemente de la advertencia? (es solo una advertencia, después de todo). –
¿No podría simplemente usar una macro corta para producir el reparto detallado? Me gusta '#define ULL (x) ((unsigned long long) x)'? – Borealid
@Robert: No, produce un no-op, como si hubiera escrito '' 32 'simple. @Borealid: Sí, podría, pero me gusta escribir código que pueda copiarse y pegarse en cualquier lugar (por ejemplo, otros proyectos) sin necesidad de definir/encabezados adicionales. Odio cosas como 'typedef unsigned int uint;'. –