Cuando se cambia un valor,
unsigned char x = ...;
int y = x << 16;
El tipo de x
se promueve a int
si unsigned char
cabe en un int
(la mayoría de los sistemas), o para unsigned
si unsigned char
no cabe en un int
(raro). Siempre que su int
tenga 25 bits de ancho o más, no se descartará ningún dato .
Tenga en cuenta que esto no tiene ninguna relación con el hecho de que 16
tiene el tipo int
.
/* All three are exactly equivalent */
x << 16;
x << 16u;
x << (unsigned char) 16;
Fuente: de n1516 (C99 borrador):
§6.5.7 párrafo 3: operadores de desplazamiento a nivel de bit
Las promociones enteros se llevan a cabo en cada uno de los operandos. El tipo de resultado es el del operando izquierdo promocionado.
§6.3.1.1 párrafo 2: booleanos, caracteres y números enteros
Si un int puede representar todos los valores del tipo de original (como restringida por el ancho, para un campo de bits ) , el valor se convierte en un int; de lo contrario, se convierte en un sin signo int. Estas se llaman promociones enteras.
Notas al pie:
: Algunos chips DSP, así como ciertas superordenadores Cray se sabe que tienen sizeof(char) == sizeof(int)
. Esto simplifica el diseño de la unidad de almacenamiento de carga del procesador a costa de un consumo de memoria adicional.
: Si su desplazamiento a la izquierda es ascendido a int
y luego se desborda el int
, este es un comportamiento indefinido (demonios pueden volar fuera de la nariz).En comparación, el desbordamiento de un unsigned
siempre está bien definido, por lo tanto, los cambios de bit deben realizarse generalmente en en los tipos unsigned
.
El valor de la expresión no está asignado. –
Tal como está escrito, el compilador optimizará la operación de cambio como no hacer nada. ¿Cuál fue el código real? –
es posible que desee consultar esto: http://stackoverflow.com/questions/437470/type-to-use-to-represent-a-byte-in-ansi-c89-90-c –