質問: INT_MIN / 10) && (*str - 0 > -1 * (INT_MINT % 10))) 少しの変化もありません・・・ どなたか教えてください。
回答: int以外の型を使わない論理も考えることはできます。頭の体操的なものになりますが、質問者さんご自身は論理の練習のためにコードを書いていると思うので・・・。ただ2の補数表現であることは仮定してみました。(それはCの仕様の前提ではないかも知れませんが) * INT_MAXを超える結果になると手遅れなので、超える前にチェックする * 超える前の数値はどこまで許されるか考える * INT_MAX,INT_MINの最後の桁は絶対に0にならない(2の補数表現を仮定したから) INT_MAX/10,INT_MIN/10の絶対値は同じ値になる。またINT_MINの最後の桁は(INT_MAX%10)より1大きくなる。 基本的にはINT_MAX/10を超えたらoverflow、INT_MAX/10と等しければ最後の桁がINT_MAX%10(負のときはそれ+1)を超えたらoverflowと考えることができます。 ``` #include #include #define LIMIT (INT_MAX / 10) #define POSITIVE_LAST_D (INT_MAX % 10) int another_atoi(const char* str) { int sign = 1; int last_d = POSITIVE_LAST_D; switch (*str) { case '-': sign = -1; last_d++; case '+': str++; break; } int num = 0; for ( ; isdigit(*str); str++) { int d = *str - '0'; if (num >= LIMIT) { // 典型ケースを一度の判定で済ます if (num > LIMIT || d > last_d) goto OVERFLOW; } num = num * 10 + d; } return sign * num; OVERFLOW: // ...さぼり return 0; } ```