Imprimiendo número binario dando resultados extraños

Estaba revisando los operadores de bitwise y escribí un código simple para imprimir la representación binaria de números, pero tengo una salida loca y no tengo ninguna explicación. ¿Por qué el progtwig no me da los números binarios correctos? Aquí está la salida de muestra: introduzca la descripción de la imagen aquí

y mi código:

#include  #include  void pBinary(int x); int main(void) { for (int n = 0; n < 20; n++) { pBinary(n); } return 0; } void pBinary(int x) { int y = 1 << 31; for (int n = 0; n >= 1; } putchar('\n'); } 

Si int tiene una longitud de 32 bits, 1 << 31 invoca un desbordamiento de enteros con signo, que es un comportamiento indefinido .

Considere hacer el valor para tratar sin firmar.

 void pBinary(unsigned int x) { unsigned int y = 1u << 31; for (int n = 0; n < 32; n++) { x & y ? putchar('1') : putchar('0'); y >>= 1; } putchar('\n'); } 

Es más seguro usar tipos con tamaño definido. Incluya inttypes.h o stdint.h para usar uint32_t .

 void pBinary(uint32_t x) { uint32_t = UINT32_C(1) << 31; for (int n = 0; n < 32; n++) { x & y ? putchar('1') : putchar('0'); y >>= 1; } putchar('\n'); } 

Aquí te queda desplazado el número 1 ..31 lugares. Seguramente un desbordamiento ya que por defecto se realiza sobre número firmado.

 #include  #include  void pBinary(int x); int main(void) { for (int n = 0; n < 20; n++) { pBinary(n); } return 0; } void pBinary(int x) { unsigned int y = (1u << 31); //avoid overflow for (int n = 0; n < 32; n++) { (x & y) ? putchar('1') : putchar('0'); y >>= 1; } putchar('\n'); }