2

32 ビットの符号なし数値を 32 ビットの符号付き数値に追加するときに、次のチェックが必要です。

  1. 結果が負の場合、結果を 0 に設定 [Floor Condition]
  2. 結果が >UINT_MAX の場合、結果を UINT_MAX に設定 [Saturate Condition]

これを実装する最もクリーンで最適な方法は何ですか?

4

3 に答える 3

4

両方を符号付き 64 ビット型に変換し、加算を実行してから、チェックを実行することをお勧めします ( min/maxマクロ/関数を使用する可能性があります)。

于 2013-05-31T01:28:19.970 に答える
1
uint32_t add_sat(uint32_t a, int32_t b) {
    if (b < 0 && a < -(uint32_t)b) return 0;
    if (b > 0 && a + b < a) return UINT32_MAX;
    return a + b;
}
于 2013-05-31T01:45:04.120 に答える