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:
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'); }