Cpp:オーバーフロー

差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン 前のリビジョン
次のリビジョン
前のリビジョン
Cpp:オーバーフロー [2022/11/29 23:43] – 削除 - 外部編集 (Unknown date) 127.0.0.1Cpp:オーバーフロー [2025/04/12 05:15] (現在) – 外部編集 127.0.0.1
行 1: 行 1:
 +# オーバーフロー
 +
 +参考:[[https://www.jpcert.or.jp/sc-rules/c-int32-c.html|INT32-C. 符号付き整数演算がオーバーフローを引き起こさないことを保証する]]
 +
 +##### 乗算の場合
 +
 +```
 +void func(signed int si_a, signed int si_b) {
 +  signed int result;
 +  if (si_a > 0) {  
 +    if (si_b > 0) {  
 +      if (si_a > (INT_MAX / si_b)) {
 +        /* エラー処理 */
 +      }
 +    } else { /* si_a は正、 si_b はゼロ以下 */
 +      if (si_b < (INT_MIN / si_a)) {
 +        /* エラー処理 */
 +      }
 +    } /* si_a は正、si_b はゼロ以下 */
 +  } else { /* si_a はゼロ以下 */
 +    if (si_b > 0) { /* si_a is nonpositive, si_b is positive */
 +      if (si_a < (INT_MIN / si_b)) {
 +        /* エラー処理 */
 +      }
 +    } else { /* si_a と si_b はゼロ以下 */
 +      if ( (si_a != 0) && (si_b < (INT_MAX / si_a))) {
 +        /* エラー処理 */
 +      }
 +    }
 +  }
 +
 +  result = si_a * si_b;
 +}
 +```