# オーバーフロー 参考:[[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; } ```