差分
このページの2つのバージョン間の差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
Cpp:オーバーフロー [2022/11/29 23:43] – 削除 - 外部編集 (Unknown date) 127.0.0.1 | Cpp:オーバーフロー [2025/04/12 05:15] (現在) – 外部編集 127.0.0.1 | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | # オーバーフロー | ||
+ | |||
+ | 参考:[[https:// | ||
+ | |||
+ | ##### 乗算の場合 | ||
+ | |||
+ | ``` | ||
+ | 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, | ||
+ | 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; | ||
+ | } | ||
+ | ``` | ||