繁体   English   中英

C++ bool 获得随机/错误值?

[英]C++ bool gets random/wrong value?

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

#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

这是一个证明:

在此处输入图片说明

看起来部分node->size - size - sizeof(MallocMetadata)是以无符号整数计算的。

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

因此,该值看起来像是大值(128 或更多),使得表达式(node->size - size - sizeof(MallocMetadata)) < 128假。

另一方面, int tmp_res=node->size - size - sizeof(MallocMetadata); 将大值转换为int int是有符号的,它可能给出与上面不执行转换为int的表达式不同的值。

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

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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM