首页 > 解决方案 > 如果我将 unsigned int 分配给 signed int,是否会有未初始化的位

问题描述

我有一个无符号整数(比如 32 位),当我将它分配给一个有符号整数时,转换后是否有未初始化的位留在有符号整数中。

unsigned int i = 10 
int j = i;

我从 valgrind 得到一个错误,说在观察到未初始化的字节

int func(long,int,int);

我在第三个参数中看到一个 unsigned int 被传递给这个函数。我怀疑这个无符号签名的转换会导致这个 valgrind 错误

标签: c++valgrindbitunsignedsigned

解决方案


当您分配给变量时,您分配的是右侧的值,而不是右侧的对象表示。因此,在分配变量后永远不会有未初始化的位(或字节)。

此外,由于字节是最小可寻址单元,因此您不能仅将值分配给字节中的某些位。要么全有,要么全无。

如果通过 achar *或 via完成,则可以仅分配给变量的特定字节memcpy。例如:

unsigned char c[] = { 1, 2 };
int j;
memcpy(&j, c, sizeof(c));

假设 anint是 4 个字节,那么只有前 2 个字节j被写入,最后 2 个保持未初始化。


推荐阅读