Sams Teach Yourself C++ in 21 Days (6th ed.) を使用して、C++ をもう一度学習しようとしています。各章を確実に理解できるように、非常に徹底的に作業するようにしています (ただし、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
であるという事実によって説明されます。によって貢献された 50 のために、なぜ 2 行目が と読まないのか理解できません。1294967346
2^32 - 3000000000
1294967396
smallnum
3行目と 4 行目は説明できません。これらの結果はどのようにして得られるのでしょうか?
2^32
編集: 3 行目 -符号付き int に許可されている値の範囲に収まるモジュロを法とする解を見つけるだけで、この結果が得られますか?