首页 > 解决方案 > 为什么负 size_t 下溢但减去它却没有?

问题描述

我在这里有一个简单的程序,它返回 18446744073709551615:

#include <iostream>

using namespace std;

int main()
{
    cout<<-(size_t)1;
    cout<<0-(size_t)1;
    return 0;
}

另外,我这里也有这个程序,它返回预期的结果 0:

#include <iostream>

using namespace std;

int main()
{
    cout<<1-(size_t)1;
    return 0;
}

有人可以向我解释这里发生了什么吗?如果-(size_t)10-(size_t)1都下溢,为什么1-(size_t)1很好?

标签: c++integersize-tunderflow

解决方案


为什么 1-(size_t)1 很好?

因为不会溢出。1 可表示为std::size_t,减法结果为 0 也是可表示的。

所以不应该 -(size_t)1 评估为大数字

正如您在第一个示例中使用一元减号运算符时所发现的那样。但是您在第二个示例中没有使用一元减号运算符。您使用了二进制减号运算符。

那么它会变成1+大数吗?

减法不会“变成”加法。

也就是说,你会发现它 1 + std::size_t(-1)也是 0。这是因为无符号算术是模块化的。-1 与某个大值一致,而那个大值 + 1 与 0 一致。模算术的这种特性被称为“与平移的兼容性”


推荐阅读