c++ - 带有初始化变量和负数的 memcpy

标签 c++ c qt casting memcpy

我有

    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/

相关文章:

c++ - 如何处理QPainter的边界矩形单击

c++ - 使用默认构造函数强制未初始化的成员声明

c# - C++/C# 引用

c - 在下面的示例中,如何等待每个进程终止?

c - 生成的汇编代码包含一系列到下一个内存位置的跳转命令,目的是什么

c++ - 如何删除 QT 项目文件中的重复代码?

c++ - 如何将焦点设置在特定的小部件上

c++ - OpenCV2.2 cvCaptureFromCAM 问题...只返回绿屏。 (罗技 C260 摄像头)

c++ - 如何使用自定义注册系统注册 dll 并查看导入的 dll 的可执行文件的 PE?

c - C中数字的回文