The shift operator has a maximum limit that depends on the platform / compiler.
If you are using gcc in a 64-bit PC platform, for example, and exceeds 64 the behavior of that operator is undefined.
A possible (and simple) solution for the conversion case to more than 64 bits is to create a buffer to store the result and divide the number by 2 successively to get the bits. When the division reaches zero, the next divisions will always return the bit zero:
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned long long int n = 140735601943344; // Número de entrada
char buffer[257]; // Buffer para armazenar o resultado
int i; // Contador
buffer[256] = 'Numero convertido para 256 com os 0 nao significativos:
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000011111111111111110001111100011111010001100110000
Numero convertido: 140735601943344
11111111111111110001111100011111010001100110000
Pressione qualquer tecla para continuar. . .
'; // "zera" o último caracter do buffer
printf("\nNumero convertido para 256 com os 0 nao significativos:\n");
// Utiliza um número de 256 bits como base para a conversão.
for(i = 255; i >= 0; i--)
{
// Por meio do "e" lógico ele compara se o valor
// na posição mais à direita é 1 ou 0
// e guarda o dígito binário no buffer.
if(n & 1)
{
buffer[i] = '1';
} else {
buffer[i] = '0';
}
// Divide o número por 2 para obter o próximo bit
n /= 2;
}
printf("%s\n", buffer);
printf("\n");
printf("\nNumero convertido: 140735601943344\n");
printf("\n11111111111111110001111100011111010001100110000\n");
system("pause");
return 0;
}
After execution (truncated, for easy viewing):
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned long long int n = 140735601943344; // Número de entrada
char buffer[257]; // Buffer para armazenar o resultado
int i; // Contador
buffer[256] = 'Numero convertido para 256 com os 0 nao significativos:
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000
000000000000000011111111111111110001111100011111010001100110000
Numero convertido: 140735601943344
11111111111111110001111100011111010001100110000
Pressione qualquer tecla para continuar. . .
'; // "zera" o último caracter do buffer
printf("\nNumero convertido para 256 com os 0 nao significativos:\n");
// Utiliza um número de 256 bits como base para a conversão.
for(i = 255; i >= 0; i--)
{
// Por meio do "e" lógico ele compara se o valor
// na posição mais à direita é 1 ou 0
// e guarda o dígito binário no buffer.
if(n & 1)
{
buffer[i] = '1';
} else {
buffer[i] = '0';
}
// Divide o número por 2 para obter o próximo bit
n /= 2;
}
printf("%s\n", buffer);
printf("\n");
printf("\nNumero convertido: 140735601943344\n");
printf("\n11111111111111110001111100011111010001100110000\n");
system("pause");
return 0;
}
There are other ways to do this implementation, and if the operator does not exceed the bit width of the data, the version with the shift operator performs much better.