我有
QByteArray bytes // Fullfilled earlier
char id_c = bytes[7];
int _id;
_id = 0; // If I comment this result would be different
memcpy(&_id, &id_c, 1);
int result = _id;
我有 _id 变量,如果我注释“_id=0”结果变量结果将与负数不同。为什么?为什么用 0 初始化 _id 会有所不同?! 我怎样才能使用“_id=0”获得相同的结果,但没有 memcpy 和不需要的转换?
这不是我的代码。我感兴趣的是如何在没有愚蠢的转换的情况下正确地获得相同的结果。
最佳答案
正确。
因为这条语句:
memcpy(&_id, &id_c, 1);
只是从 &id_c
复制一个字节到一个代表 4 字节整数的地址,&_id
。只有 _id
占用的内存的第一个字节才会将任何内容复制到其中。如果没有首先对 _id
进行零初始化,则该值的其余三个字节将保持未定义状态(可能是堆栈中的随机垃圾值)。
“不需要的转换”有什么问题?这很好,编译器会生成最高效的代码。
QByteArray bytes // Fullfilled earlier
int _id = (int)(bytes[7]);
int result = _id;
如果你想将无符号字节的符号扩展结果复制到_id
,那么:
int _id = (signed char)(bytes[7]);
关于c++ - 带有初始化变量和负数的 memcpy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64801046/