从在C存储器地址++作为十六进制打印值

问题描述 投票:3回答:2

我试图做一个程序,它在一个整数值,然后打印出每一个十六进制的四个字节的值。因此,对于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什么是C的?

c++ hex
2个回答
2
投票

在你cout声明,您是铸造(q+i)本身的int*指针,然后解引用它来得到一个int值。这是不对的,因为(q+i)不会在int点带面,提领它因此将超过num的边界进入i > 0时,周围的内存。

你需要,而不是取消引用(q+i)原样得到它实际上指向unsigned char,然后该值转换为一个[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


2
投票

CCs是未初始化的堆栈存储器标签,通过Visual C++ in debug mode设置。

请注意,您还严格走样违规在(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] << " ";
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.