c++ - 为什么字符数组不给出无符号结果
问题描述
在这个项目中,我应该接收一个数据包,并将其中的一部分转换为一个无符号整数并获得 Big-Endian 和 Little-Endian 结果。最初,我只想将字节数组(数据包)内的指针转换为无符号整数类型,该类型会自动将接收到的值放入 Big-Endian 形式,就像(uint32_be_t*)packet;
它在执行时自动放入 Little-Endian 形式的方式一样(uint32_t*)packet
.
由于找不到自动执行此操作的类型,因此我决定创建自己的结构,称为“u32”,该结构具有“get”方法,该方法以 Big-Endian 形式获取值,“get_le”获取Little-Endian 形式的值。但是,我注意到当我这样做时,我会从 Little-Endian 结果中得到一个否定的结果。
struct u32 {
u8 data[4] = {};
uint32_t get() {
return ((uint32_t)data[3] << 0)
| ((uint32_t)data[2] << 8)
| ((uint32_t)data[1] << 16)
| ((uint32_t)data[0] << 24);
}
uint32_t get_le() {
return ((uint32_t)data[3] << 24)
| ((uint32_t)data[2] << 16)
| ((uint32_t)data[1] << 8)
| ((uint32_t)data[0] << 0);
}
};
为了模拟一个数据包,我只是创建了一个字符数组,然后像这样将一个 u32* 转换为它:
int main() {
char ary[] = { 0x00, 0x00, 0x00, (char)0xF4 };
u32* v = (u32*)ary;
printf("%d %d\n", v->get(), v->get_le());
return 0;
}
但后来我得到了结果:244 -201326592
为什么会这样?“get_le”的返回类型是 uint32_t,第一个函数“get”应该返回 Big-Endian 无符号整数,它执行正确。
作为旁注,这只是一个突然出现在我脑海中的测试,所以我去图书馆在类之间测试它,但不幸的是,这意味着我必须使用在线编译器(onlinegdb),但我认为它会在 Visual Studio 中工作相同。此外,如果您对如何改进我的代码有任何建议,我们将不胜感激。我正在使用 Visual Studio 2019 并且允许使用 cstdlib。
解决方案
%u
好吧,我敢说你不想%d
在那个printf()
格式字符串中使用!
%d
假设该值是有符号的,所以如果最高有效位是1
你得到一个减号。
推荐阅读
- javascript - 提示中的新行
- javascript - webpack 自定义加载器只选择一个文件而不是所有文件
- python-3.x - 如果在 python 版本 3 中使用 end="" 给出如下输入,我如何在同一行中打印非文本数据
- database - 当我尝试使用 Firebase 时,在 Swift5 中使用未解析的标识符“快照”
- android - Android(kotlin),如何获取资产文件路径?(在 pytorch 手机上)
- django - django模型用空列表获取所有值
- javascript - 将 C# 中的 Javascript Keydown 事件添加到文本框
- java - 走遗产清单
- c++ - 我正在使用 C++,需要帮助识别代码中的错误
- deep-learning - 深度学习术语中的耐心是什么意思?