_strtoi64関数について
_strtoi64関数について質問です。
文字列(0xFFFFFFFFFFFFFFFF等)を_INT64型に変換させたいのですが
マイナス値の変換をしようとするとオーバーフロー値:I64_MAXが
戻り値として帰ってきます。 マイナスの文字列の変換は出来ない
のでしょうか?
_strtoi64関数内部のIF分の判定がおかしいような気がする(今環境が
なく詳しい事は書けなくてすいません)のですがそれとも_strtoi64関数
の使い方がおかしいのでしょうか?
_strtoi64(buf, (char**)NULL, 16)
環境:VisualStudio.NET
OS:WindowsXP
>_strtoi64関数内部のIF分の判定がおかしいような気がする
見てみましたが確かにおかしいですね。
(16進表記は正整数とみなしている?)
しょうがないので、_strtoui64 で unsigned の値を得て、
signed に無理やり代入してはどうでしょうか?
__int64 a = _strtoui64(buf, NULL, 16);
関数がエラー値を返すのが正しいかどうかはおいといて
接尾文字のない16進定数は
・int の正値で表現できる範囲=int 型
・int の正値で表現できない範囲=unsigned int 型
と解釈されます(1の補数系を考えると、このように解釈しないと困る)
だからそもそも16進表現で負値を表現できると考えるのが間違い。
例:int が 16bit な処理系と仮定し
0x0000〜0x7FFF : int 型
0x8000〜0xFFFF : unsigned int 型
(JIS X 3010:2003 6.4.4.1 ISO/IEC 14882:1998 2.13.1-2)
__int64 は言語規格書にない型ですが、同じ規則を採用しているのでしょう。
0x7FFFFFFFFFFFFFFF=__int64 型
0x8000000000000000=unsigned __int64 型であり __int64 では表現不能
isshi さんの答えが適切でしょう。
isshiさんtetrapodさん返信ありがとうございます。
基本的に16進定数はマイナス値が使えないと言うことでしょうか。
strtoi関数だと16進定数でもマイナス値が使えるのですが、32bit
マシーンにおいて、まだ_INT64には対応していないと言うことでしょうか。
とりあえず今回は、_strtoui64 で unsigned の値を得て、
signed に無理やり代入する事にします。
>strtoi関数だと16進定数でもマイナス値が使えるのですが
そのような関数は VC には見当たらないのですが。
strtol のことだとしても、やはり16進文字列はマイナス値に変換されませんでした。(VC7.1)
isshiさんありがとうございました。
すいません勘違いしてました。
strtolでも16進文字列はマイナス値に変換できませんね。
たびたびありがとうございました。
ツイート | ![]() |