オーバーフローしない?
ここでの「オーバーフロー」とは、「オペランドに適合しない値を生成する」ことを意味します。算術モジュロが適用されるため、値は常にオペランドに適合し、オーバーフローは発生しません。
つまり、オーバーフローが実際に発生する前に、C++ は既に値を切り捨てています。
モジュロ?
他の値を法として値を取るということは、除算を適用し、剰余を取ることを意味します。
例えば:
0 % 3 = 0 (0 / 3 = 0, remainder 0)
1 % 3 = 1 (1 / 3 = 0, remainder 1)
2 % 3 = 2 (2 / 3 = 0, remainder 2)
3 % 3 = 0 (3 / 3 = 1, remainder 0)
4 % 3 = 1 (4 / 3 = 1, remainder 1)
5 % 3 = 2 (5 / 3 = 1, remainder 2)
6 % 3 = 0 (6 / 3 = 2, remainder 0)
...
このモジュロは、型が保持できる最大値を除数として、符号なしのみの計算の結果に適用されます。たとえば、最大値が 2^16=32768 の場合、32760 + 9 = (32760 + 9) % (32768+1) = 0
.