c++ - 带有初始化变量和带有强制转换的负数的 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
将任何内容复制到其中。如果没有 first 的零初始化_id
,则该值的其余三个字节未定义(可能是堆栈中的随机垃圾值)。
“不需要的演员”有什么问题?这同样好,编译器生成最有效的代码。
QByteArray bytes // Fullfilled earlier
int _id = (int)(bytes[7]);
int result = _id;
如果您想要将无符号字节的符号扩展结果复制到_id
中,那么:
int _id = (signed char)(bytes[7]);
推荐阅读
- javascript - 如何使用 papaparse 解析?
- c# - 警告开发人员使用异步方法的代码分析器
- firebase - 为什么我不再能够部署函数(错误 503)?
- ios - MKAnnotation 和 firebase
- python - 碰撞后如何阻止角色移动?
- javascript - jQuery 修复了在滚动时缩小到较小尺寸的导航栏是超级错误的
- javascript - 渲染一个复选框并根据从一个数据集到另一个数据集的值的存在来检查它
- python - 使用 Django 下载 40,000+ 行 csv 失败并出现“网络错误”
- javascript - 如何四舍五入到最接近的 0.05?
- go - 如何在 Windows/Mac/Linux 中创建隐藏文件?