• ベストアンサー

strtol で 16 進への変換

strtol で例えば "EEEEEEEE" を 16 進変換すると 0X7FFFFFFF になってしまいます。なぜなのでしょうか??? unsigned long a = strtol("EEEEEEEE", NULL, 16);

質問者が選んだベストアンサー

  • ベストアンサー
  • Werner
  • ベストアンサー率53% (395/735)
回答No.1

strtolはlong型を返すので、 変換結果がLONG_MAXより大きいと表現範囲を超えるため正しく数値に変換できません。 longで表現できる値を超えてしまって正しく変換できなかったときは errnoにERANGEが格納されます。 http://www9.plala.or.jp/sgwr-t/lib/strtol.html

参考URL:
http://www9.plala.or.jp/sgwr-t/lib/strtol.html
take765
質問者

お礼

なるほど、strol の符号なしバージョンが stroul なんですね。全く気づきませんでした。どうもありがとうございました。

その他の回答 (1)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

すでに回答が付いてしまっていますが、せっかく書いたので #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 を使え、ということで。

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/strtoul.3.html
take765
質問者

お礼

どうも丁寧なご回答をありがとうございました。言われればなるほどですね。strol でなくて、stroul を使うんですね。どうもありがとうございました。

関連するQ&A