我正在尝试重新学习 C++,使用 Sams Teach Yourself C++ in 21 Days(第 6 版)。我正在尝试非常彻底地完成它,确保我理解每一章(尽管我已经熟悉 C 语法语言)。
在第 5 章(清单 5.2)的开头附近,有一点是关于无符号整数溢出的。根据他们的例子,我写了这个:
#include <iostream>
int main () {
unsigned int bignum = 100;
unsigned int smallnum = 50;
unsigned int udiff;
int diff;
udiff = bignum - smallnum;
std::cout << "Difference (1) is " << udiff << "\n";
udiff = smallnum - bignum;
std::cout << "Difference (2) is " << udiff << "\n";
diff = bignum - smallnum;
std::cout << "Difference (3) is " << diff << "\n";
diff = smallnum - bignum;
std::cout << "Difference (4) is " << diff << "\n";
return 0;
}
这给出了以下输出,这对我来说并不奇怪:
Difference (1) is 50
Difference (2) is 4294967246
Difference (3) is 50
Difference (4) is -50
如果我更改程序以便声明的行bignum
改为读取,unsigned int bignum = 3000000000;
则输出改为
Difference (1) is 2999999950
Difference (2) is 1294967346
Difference (3) is -1294967346
Difference (4) is 1294967346
其中第一个显然很好。这个数字1294967346
是由一个事实来解释1294967346
的2^32 - 3000000000
。我不明白为什么第二行没有读取1294967396
,因为 50 贡献了smallnum
.
第三和第四行我无法解释。这些结果是如何产生的?
编辑:对于第三行 - 它是否仅通过找到2^32
适合有符号 int 允许的值范围的解模来给出此结果?