【问题标题】:C++ bool gets random/wrong value?C++ bool 得到随机/错误的值?
【发布时间】:2021-09-08 20:31:39
【问题描述】:

在调试我的代码时,我注意到发生了一些奇怪的事情,所以我添加了更多行并且更加困惑:

#include <iostream>
#include <memory>

struct Node
{
    size_t size = 0;
};

class MallocMetadata {
public:
    size_t size; /** Effective allocation - requested size **/
    bool is_free;
    MallocMetadata *next;
    MallocMetadata *prev;
    MallocMetadata *next_free;
    MallocMetadata *prev_free;
};

int main()
{
    size_t size = 0;
    auto node = std::make_shared<Node>();
    int tmp_res=node->size - size - sizeof(MallocMetadata);
    bool test=(node->size - size - sizeof(MallocMetadata)) < 128;
    bool test1=tmp_res<128;
    std::cout << tmp_res << "\n";
    std::cout << test << "\n";
    std::cout << test1 << "\n";
}

运行这 3 行后,我看到了:

tmp_res=-48
test = false
test1 = true

这怎么可能!为什么test为假,-48小于128

这是一个证明:

【问题讨论】:

  • @AlanBirtles 代码非常庞大,无法拆分。我发誓太努力了,但除非你不想看到 700 行,否则很难。
  • 修改代码为:auto tmp_res=node-&gt;size - size - sizeof(MallocMetadata);
  • 您不需要庞大的代码来向我们展示所涉及的变量的类型。 size 是一些 node 的成员并不重要,但我们需要知道它的类型
  • 请注意不是每个人都可以查看图像。代码应该以代码而不是图像的形式发布:meta.stackoverflow.com/questions/285551/…。我不明白为什么在关于代码的问题中询问代码会经常以讨论结束。嗯嗯。没关系。

标签: c++ debugging boolean


【解决方案1】:

看起来node-&gt;size - size - sizeof(MallocMetadata) 部分是用无符号整数计算的。

当无符号整数的计算为负数时,将类型的最大数加一并返回结果。

因此,该值看起来很大(128 或更大),使得表达式(node-&gt;size - size - sizeof(MallocMetadata)) &lt; 128 为假。

另一方面,int tmp_res=node-&gt;size - size - sizeof(MallocMetadata); 会将大值转换为intint 已签名,它可能会给出与上面不执行转换为 int 的表达式不同的值。

【讨论】:

  • @mick bool test2 = node-&gt;size &lt; 128 + size + sizeof(MallocMetadata);? (如果size 不会太大)
  • 这怎么一样?我希望他们的总和少于 128 不仅node-&gt;size
  • @mick 基本代数a - b - c &lt; d === a &lt; d + b + c
  • 刚才看到了,但是为什么会这样呢?结果(应该是负数)保存在 int 而不是 size_t 所以它应该是正确的。 @AlanBirtles
  • 看到至少有 2 人同意“这是怎么一回事”的评论,我有点失望和担心,因为这是在小学学习的基本代数......
【解决方案2】:

我相信,只要表达式中有无符号值,结果也往往是无符号的。

size_t size = 0;
auto val = 1 + 100 + (-100) + size;
std::cout << typeid(val).name();

'val' 也将是 size_t。所以在你的情况下,你试图在 size_t 中存储一个负值,这会导致溢出。 您可以将其显式类型转换为有符号整数,如果我没记错的话就足够了。像这样:

bool test=int(node->size - size - sizeof(MallocMetadata)) < 128;

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-11-16
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-16
  • 2017-11-22
相关资源
最近更新 更多