[c++] Как печатать (используя cout) способ хранения числа в памяти?


Answers

Используйте преобразование «на лету» в std::bitset . Нет временных переменных, нет циклов, нет функций, нет макросов.

Live On Coliru

#include <iostream>
#include <bitset>

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;
}

Печать:

a = 11000110
b = 11111000
c = 1111111011000101
Question

Я слежу за курсом колледжа об операционных системах, и мы учимся, как конвертировать из двоичного в шестнадцатеричное, десятичное в шестнадцатеричное и т. Д., И сегодня мы узнали, как подписанные / неподписанные числа хранятся в памяти с использованием двух дополнений (~ число + 1).

У нас есть несколько упражнений, которые можно сделать на бумаге, и я хотел бы иметь возможность проверить свои ответы, прежде чем отправлять свою работу учителю. Я написал программу на C ++ для первых нескольких упражнений, но теперь я застрял в том, как проверить свой ответ со следующей проблемой:

char a, b;

short c;
a = -58;
c = -315;

b = a >> 3;

и нам нужно показать двоичное представление в памяти a , b и c .

Я сделал это на бумаге, и это дает мне следующие результаты (все двоичные представления в памяти чисел после дополнения двух):

a = 00111010 (это символ, поэтому 1 байт)

b = 00001000 (это символ, поэтому 1 байт)

c = 11111110 11000101 (это короткий, так что 2 байта)

Есть ли способ проверить мой ответ? Есть стандартный способ в C ++, чтобы показать двоичное представление в памяти числа или мне нужно каждый раз закодировать каждый шаг (вычислить дополнение двух, а затем преобразовать в двоичный)? Я знаю, что последнее не займет так много времени, но мне любопытно, есть ли стандартный способ сделать это.




Это то, что вы ищете?

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



Есть ли стандартный способ в C ++ для отображения двоичного представления в памяти числа [...]?

Нет. Нет std::bin , например std::hex или std::dec , но нетрудно вывести двоичный код:

Вы выводите самый левый бит, маскируя все остальные, сдвигая влево и повторяя это для всех бит, которые у вас есть.

(Число бит в типе - sizeof(T) * CHAR_BIT .)




#include <iostream> 
#include <cmath>       // 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
}



Related