我正在尝试再学习C++,使用SAMS自学C++ 21天(第六版)。我试着把它做得非常彻底,确保我理解每一章(尽管我已经熟悉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
,由于
smallnum
.
第三个
第四行
我无法解释。这些结果是如何产生的?
编辑:对于第三行-它仅仅通过找到解的模来给出这个结果吗
2^32