我正在尝试制作一个程序,该程序接受一个整数值,然后以十六进制打印出每个四个字节的值。因此对于255,它应该打印出FF 00 0000。这就是到目前为止我的代码。
#include "pch.h"
#include <iostream>
#include <iomanip>
using namespace std;
int main()
{
int num;
cout << "Enter an integer" << endl;
cin >> num;
int* p = #
unsigned char* q = (unsigned char*)p;
for (int i = 0; i < 4; i++) {
cout<< hex <<*(int*)(q+i) << " ";
}
}
当我输入255时,它将打印ff cc000000 cccc0000 cccccc00
,c是什么?
答案 0 :(得分:2)
在cout
语句中,您将(q+i)
自身强制转换为int*
指针,然后对其进行解引用以获取int
值。这是错误的,因为(q+i)
并不指向int
,并且在num
时取消对它的引用将超出i > 0
的边界到周围的内存中。
您需要按原样取消对(q+i)
的引用,以获取它实际指向的unsigned char
,然后将THAT值转换为[unsigned
] int
(或至少打印到[[unsigned
] short
):
cout << hex << static_cast<int>(*(q+i)) << " ";
此外,int
在所有系统上都不总是4个字节,因此您不应该对大小进行硬编码,而应使用sizeof(int)
:
for (int i = 0; i < sizeof(num); i++)
答案 1 :(得分:2)
CC
是未初始化的堆栈存储器标签,由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*)#
for (int i = 0; i < 4; i++) {
cout << hex << (int)q[i] << " ";
}
}