【问题标题】:Can there be unitialized bits if I assign unsigned int to signed int如果我将 unsigned int 分配给 signed int,是否会有未初始化的位
【发布时间】:2019-09-08 18:53:24
【问题描述】:

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

unsigned int i = 10 
int j = i;

我从 valgrind 得到一个错误,说在

观察到未初始化的字节
int func(long,int,int);

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

【问题讨论】:

  • 你为什么要问?既然你用valgrind 标记了你的问题,有什么让你怀疑的吗?
  • 你的意思是在主值之前是否可以有1s?不。它将值 10 分配给有符号整数
  • 我不明白 uninitialized 部分 - 位 cab 为 0 或 1,如果未设置,则必须清除。没有第三种选择。
  • @user1660982 请提供minimal reproducible example,以便在此处按要求重现您的问题。
  • @user1660982 这是不可能的。你做错了什么。

标签: c++ valgrind bit unsigned signed


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-12
    • 2019-10-07
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    相关资源
    最近更新 更多