- ベストアンサー
strtol で 16 進への変換
strtol で例えば "EEEEEEEE" を 16 進変換すると 0X7FFFFFFF になってしまいます。なぜなのでしょうか??? unsigned long a = strtol("EEEEEEEE", NULL, 16);
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
strtolはlong型を返すので、 変換結果がLONG_MAXより大きいと表現範囲を超えるため正しく数値に変換できません。 longで表現できる値を超えてしまって正しく変換できなかったときは errnoにERANGEが格納されます。 http://www9.plala.or.jp/sgwr-t/lib/strtol.html
その他の回答 (1)
- sakusaker7
- ベストアンサー率62% (800/1280)
すでに回答が付いてしまっていますが、せっかく書いたので #include <stdio.h> #include <stdlib.h> #include <error.h> int main() { const char *numstr = "EEEEEEEE"; unsigned long nval; errno = 0; nval = strtol(numstr, NULL, 16); printf("strtol = %lu\n", nval); perror(""); errno = 0; nval = strtoul(numstr, NULL, 16); printf("strtol = %lu\n", nval); perror(""); return 0; } メッセージを見てわかるとおり、32bit long ではオーバーフローを起こしています。 無符号での値を取得したければ strtoul を使え、ということで。
お礼
どうも丁寧なご回答をありがとうございました。言われればなるほどですね。strol でなくて、stroul を使うんですね。どうもありがとうございました。
お礼
なるほど、strol の符号なしバージョンが stroul なんですね。全く気づきませんでした。どうもありがとうございました。