O operador en C no funciona

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.