首页 > 解决方案 > 带有初始化变量和带有强制转换的负数的 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 和不需要的铸件的方式来执行此操作?

这不是我的代码。我很感兴趣如何在没有愚蠢的铸件的情况下正确获得相同的结果。

标签: c++cqtcastingmemcpy

解决方案


正确的。

因为这个声明:

memcpy(&_id, &id_c, 1); 

仅将单个字节从&id_c表示 4 字节整数的地址复制到&_id. 只有被占用的内存的第一个字节才能_id将任何内容复制到其中。如果没有 first 的零初始化_id,则该值的其余三个字节未定义(可能是堆栈中的随机垃圾值)。

“不需要的演员”有什么问题?这同样好,编译器生成最有效的代码。

QByteArray bytes    // Fullfilled earlier   
int _id = (int)(bytes[7]);
int result = _id;

如果您想要将无符号字节的符号扩展结果复制到_id中,那么:

int _id = (signed char)(bytes[7]);

推荐阅读