c++ - 如果我将 unsigned int 分配给 signed int,是否会有未初始化的位
问题描述
我有一个无符号整数(比如 32 位),当我将它分配给一个有符号整数时,转换后是否有未初始化的位留在有符号整数中。
unsigned int i = 10
int j = i;
我从 valgrind 得到一个错误,说在观察到未初始化的字节
int func(long,int,int);
我在第三个参数中看到一个 unsigned int 被传递给这个函数。我怀疑这个无符号签名的转换会导致这个 valgrind 错误
解决方案
当您分配给变量时,您分配的是右侧的值,而不是右侧的对象表示。因此,在分配变量后永远不会有未初始化的位(或字节)。
此外,由于字节是最小可寻址单元,因此您不能仅将值分配给字节中的某些位。要么全有,要么全无。
如果通过 achar *
或 via完成,则可以仅分配给变量的特定字节memcpy
。例如:
unsigned char c[] = { 1, 2 };
int j;
memcpy(&j, c, sizeof(c));
假设 anint
是 4 个字节,那么只有前 2 个字节j
被写入,最后 2 个保持未初始化。
推荐阅读
- python - Python无法附加从文件中读取的内容
- iphone - 物理学帮助寻找次级电压
- android - Add marker to map fragment from onFocusChange() method of Edit Text
- swift - Swift Mac 和 CloudKit 上的问题,应用程序运行后立即崩溃
- sql - 需要 SQL 查询以在 oracle 中打印从 2016 年 11 月到 2018 年 10 月的月份和年份记录数
- excel - json.dump 的等价物可用于 Python 指定的 excel 单元格?
- python - 在 sklearn 中创建自定义回归器
- excel - ShapeRange、Chart、ChartArea 和 PlotArea 是什么关系
- angular - FormArray multiple get datain onSubmitForm ionic
- ajax - ajax中的总分不能与laravel一起使用