2つの32ビット整数を追加すると、整数オーバーフローが発生する可能性があります。
uint64_t u64_z = u32_x + u32_y;
このオーバーフローは、32ビット整数の1つが最初にキャストされるか、64ビット整数に追加される場合に回避できます。
uint64_t u64_z = u32_x + u64_a + u32_y;
ただし、コンパイラが追加の順序を変更することを決定した場合:
uint64_t u64_z = u32_x + u32_y + u64_a;
それでも整数オーバーフローが発生する可能性があります。
コンパイラはそのような並べ替えを行うことができますか、それとも、結果の矛盾に気づき、式の順序をそのまま維持することを信頼できますか?
((uint32_t)-1 + (uint32_t)1) + (uint64_t)0
で結果0
のに対し、(uint32_t)-1 + ((uint32_t)1 + (uint64_t)0)
中の結果0x100000000
、およびこれらの2つの値が等しくありません。したがって、コンパイラがその変換を適用できるかどうかは重要です。しかし、そうです、標準では、符号なし整数ではなく、符号付き整数に対してのみ「オーバーフロー」という単語を使用しています。
uint32_t
値のように見えるため、実際には整数オーバーフローは表示されません-オーバーフローしないため、ラップされます。これらは異なる動作ではありません。