Como imprimir (usando cout) a maneira como um número é armazenado na memory?

Estou seguindo um curso universitário sobre sistemas operacionais e estamos aprendendo a converter de binário para hexadecimal, decimal para hexadecimal, etc. e hoje aprendemos como os números assinados / não assinados são armazenados na memory usando o complemento de dois (~ number + 1).

Temos alguns exercícios para fazer no papel e gostaria de poder verificar minhas respostas antes de enviar meu trabalho ao professor. Eu escrevi um programa em C ++ para os primeiros exercícios, mas agora estou preso a como eu poderia verificar a minha resposta com o seguinte problema:

char a, b; short c; a = -58; c = -315; b = a >> 3; 

e precisamos mostrar a representação binária na memory de a , b e c .

Eu fiz isso no papel e ele me dá os seguintes resultados (todas as representações binárias na memory dos números após o complemento dos dois):

a = 00111010 (é um char, então 1 byte)

b = 00001000 (é um char, então 1 byte)

c = 11111110 11000101 (é um curto, então 2 bytes)

Existe uma maneira de verificar minha resposta? Existe uma maneira padrão em C ++ para mostrar a representação binária na memory de um número, ou eu tenho que codificar cada passo eu mesmo (calcular o complemento de dois e depois converter em binário)? Eu sei que o último não demoraria tanto, mas estou curioso para saber se existe uma maneira padrão de fazer isso.

A maneira mais fácil é, provavelmente, criar um std::bitset representando o valor e, em seguida, transmiti-lo para o cout .

 #include  ... char a = -58; std::bitset<8> x(a); std::cout << x; short c = -315; std::bitset<16> y(c); std::cout << y; 

Use conversão on-the-fly para std::bitset . Não há variables ​​temporárias, sem loops, sem funções, sem macros.

Ao vivo em Coliru

 #include  #include  int main() { int a = -58, b = a>>3, c = -315; std::cout << "a = " << std::bitset<8>(a) << std::endl; std::cout << "b = " << std::bitset<8>(b) << std::endl; std::cout << "c = " << std::bitset<16>(c) << std::endl; } 

Impressões:

 a = 11000110 b = 11111000 c = 1111111011000101 

Se você quiser exibir a representação de bits de qualquer object, não apenas um número inteiro, lembre-se de reinterpretar como uma matriz char primeiro, então você pode imprimir o conteúdo dessa matriz como hexadecimal ou binário (via bitset):

 #include  #include  #include  template void show_binrep(const T& a) { const char* beg = reinterpret_cast(&a); const char* end = beg + sizeof(a); while(beg != end) std::cout << std::bitset(*beg++) << ' '; std::cout << '\n'; } int main() { char a, b; short c; a = -58; c = -315; b = a >> 3; show_binrep(a); show_binrep(b); show_binrep(c); float f = 3.14; show_binrep(f); } 

Note que os sistemas mais comuns são little-endian, então a saída de show_binrep(c) não é o 1111111 011000101 que você espera, porque não é como é armazenado na memory. Se você está procurando uma representação de valor em binário, então um simples cout << bitset<16>(c) funciona.

Existe uma maneira padrão em C ++ para mostrar a representação binária na memory de um número […]?

Não. Não há std::bin , como std::hex ou std::dec , mas não é difícil produzir um binário numérico:

Você produz o bit mais à esquerda mascarando todos os outros, left-shift e repete isso para todos os bits que você tem.

(O número de bits em um tipo é sizeof(T) * CHAR_BIT .)

Semelhante ao que já está postado, basta usar bit-shift e mask para pegar o bit; utilizável para qualquer tipo, sendo um modelo (só não tenho certeza se existe uma maneira padrão para obter o número de bits em 1 byte, usei 8 aqui).

 #include template void printBin(const T& t){ size_t nBytes=sizeof(T); char* rawPtr((char*)(&t)); for(size_t byte=0; byte>bit)&1); } } std::cout< 
 #include  #include  // in order to use pow() function using namespace std; string show_binary(unsigned int u, int num_of_bits); int main() { cout << show_binary(128, 8) << endl; // should print 10000000 cout << show_binary(128, 5) << endl; // should print 00000 cout << show_binary(128, 10) << endl; // should print 0010000000 return 0; } string show_binary(unsigned int u, int num_of_bits) { string a = ""; int t = pow(2, num_of_bits); // t is the max number that can be represented for(t; t>0; t = t/2) // t iterates through powers of 2 if(u >= t){ // check if u can be represented by current value of t u -= t; a += "1"; // if so, add a 1 } else { a += "0"; // if not, add a 0 } return a ; // returns string } 

Função reutilizável:

 template static std::string toBinaryString(const T& x) { return std::bitset(x).to_string(); } 

Uso:

 int main(){ uint16_t x=8; std::cout << toBinaryString(x); } 

Isso funciona com todos os tipos de inteiros.

Aqui está o verdadeiro caminho para obter representação binária de um número:

 unsigned int i = *(unsigned int*) &x; 

É isso que você está procurando?

 std::cout << std::hex << val << std::endl;