No entiendo por qué el printf
final en el código de abajo no se imprime 255.
char c; c = c & 0; printf("The value of c is %d", (int)c); int j = 255; c = (c | j); printf("The value of c is %d", (int)c);
En la mayoría de las implementaciones, el tipo char
está firmado, por lo que varía entre -128
y 127
.
Esto significa que 11111111
(que es 255
escrito en binario) es igual a -1
. (Como se representa como un valor almacenado en el complemento de dos )
Para obtener lo que esperas, necesitas declarar c
como un unsigned char
, así:
unsigned char c = 0; int j = 255; c = (c | j); printf("The value of c is %d", (int)c);
Probablemente está imprimiendo -1. Eso es porque
c = (c | j);
evaluará como
c = (0 | 255) = (0 | 0xFF) = 0xFF
pero, dado que c
está firmado, 0xFF
será -1 y no 255 como esperaba. Si cambia c
por caracteres unsigned char
, se imprimirá 255, como imaginó.
Intente reemplazar char c
con unsigned char c
. Básicamente, el tipo char admite valores de -128 a 127. Su resultado es mayor que el rango admitido y los desbordamientos.
Por defecto, char
está signed char
en C. Si desea que se imprima 255
, use el unsigned char
sin embargo, explico la salida en el contexto de los caracteres signed char
para que el concepto quede claro. Si escribe j=127
entonces imprimirá 127
ya que la representación de bits es 01111111. Pero si escribe j=128
, imprimirá -128
porque la representación de bits 01111111 ha aumentado en 1 para convertirse en 10000000. ahora si escribe j=255
entonces la representación de bits es 11111111. por lo tanto, se imprimirá -1 Si escribe j=256
entonces imprimirá 0
porque cuando la representación de bits 11111111 se incrementa en 1, se convierte en 100000000. Pero solo se asigna 1 byte para una variable de caracteres, por lo que el bit más a la izquierda no se almacena y la representación de bits se convierte en 00000000. Además, si escribe j=257
, también es un caso de desbordamiento y la representación de bits se convierte en 00000001 y se imprimirá 1.