Печать значения из адреса памяти в C ++ в шестнадцатеричном виде - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь создать программу, которая принимает целочисленное значение, а затем выводит значение каждого из четырех байтов в шестнадцатеричном формате.Таким образом, для 255 он должен распечатать FF 00 00 00. Так выглядит мой код.

#include "pch.h"
#include <iostream>
#include <iomanip>
using namespace std;


int main()
{
    int num;
    cout << "Enter an integer" << endl;
    cin >> num;

    int* p = &num;
    unsigned char* q = (unsigned char*)p;

    for (int i = 0; i < 4; i++) {
        cout<< hex <<*(int*)(q+i) << " ";
    }

}

Когда я ввожу 255, он печатает ff cc000000 cccc0000 cccccc00 Что такое с?

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

CC s - это тег неинициализированной стековой памяти, установленный Visual C ++ в режиме отладки .

Обратите внимание, что вы также строго нарушаете псевдонимы при (int*)(q+i).

То, что вы вероятно хотели, это:

#include <iostream>
#include <iomanip>
using namespace std;

int main()
{
    int num;
    cout << "Enter an integer" << endl;
    cin >> num;

    unsigned char* q = (unsigned char*)&num;

    for (int i = 0; i < 4; i++) {
        cout << hex << (int)q[i] << " ";
    }

}
0 голосов
/ 11 февраля 2019

В вашем операторе cout вы приводите (q+i) к указателю int*, а затем разыменовываете его, чтобы получить значение int.Это неправильно, потому что (q+i) не указывает на int, и разыменование его как такового превысит границы num в окружающей памяти, когда i > 0.

Вам нужно вместо этого разыменовать (q+i) как есть, чтобы получить unsigned char, на который он фактически указывает, и затем привести значение TH к [unsigned] int (или, по крайней мере, к [unsigned] short) при его печати:

cout << hex << static_cast<int>(*(q+i)) << " ";

Кроме того, int - это не всегда 4 байта во всех системах, поэтому не следует жестко кодировать размер, используйте sizeof(int) вместо:

for (int i = 0; i < sizeof(num); i++)

Live Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...