Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/165.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么负的大小\u t会下溢,但减去它就不会下溢?_C++_Integer_Size T_Underflow - Fatal编程技术网

C++ 为什么负的大小\u t会下溢,但减去它就不会下溢?

C++ 为什么负的大小\u t会下溢,但减去它就不会下溢?,c++,integer,size-t,underflow,C++,Integer,Size T,Underflow,我这里有一个简单的程序,返回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 m

我这里有一个简单的程序,返回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_t1和0-size_t1下溢,为什么1-size_t1可以

为什么1号_t1可以

因为它不会溢出。1可以表示为std::size\u t,减法的结果是0,这也是可以表示的

因此,不应该将大小计算为大数值

它会的,正如你在第一个例子中使用一元负号操作符时所发现的。但在第二个示例中,您没有使用一元减号运算符。您使用了二进制减号运算符

那么它会变成1+大数吗

减法不能变成加法


也就是说,您会发现1+std::size_t-1也是0。这是因为无符号算术是模运算-1与某个大值全等,大值+1与0全等。模运算的这个特性被称为与翻译的兼容性。

1-1是0。你为什么期望下溢?你不是在做1+-size\u t1,你是在做减法运算,减法运算和以编程方式添加否定运算不同。@ShadowRanger所以不应该-size\u t1求值为大数,然后它会变成1+大数?@churill对,但在后一个操作顺序中,我希望-size\u t1首先变成大数否,因为你没有做负数的加法,所以你做了减法。否定和减法是独立的。一元否定与二元减法无关。@starckoverfar我想如果1+-size_t1在数学上是等价的,你会怎么想-size_t1环绕到最大可能的size_t值。在您考虑的情况下,得到的是1+max_size_t_值,该值返回到0。