_strtoi64関数について

解決


KANAGAWA  2005-06-24 08:15:03  No: 58035

_strtoi64関数について

_strtoi64関数について質問です。
文字列(0xFFFFFFFFFFFFFFFF等)を_INT64型に変換させたいのですが
マイナス値の変換をしようとするとオーバーフロー値:I64_MAXが
戻り値として帰ってきます。 マイナスの文字列の変換は出来ない
のでしょうか?

_strtoi64関数内部のIF分の判定がおかしいような気がする(今環境が
なく詳しい事は書けなくてすいません)のですがそれとも_strtoi64関数
の使い方がおかしいのでしょうか?

_strtoi64(buf, (char**)NULL, 16)

環境:VisualStudio.NET
OS:WindowsXP


isshi  2005-06-24 09:19:34  No: 58036

>_strtoi64関数内部のIF分の判定がおかしいような気がする
見てみましたが確かにおかしいですね。
(16進表記は正整数とみなしている?)

しょうがないので、_strtoui64 で unsigned の値を得て、
signed に無理やり代入してはどうでしょうか?

__int64 a = _strtoui64(buf, NULL, 16);


tetrapod  2005-06-24 17:35:03  No: 58037

関数がエラー値を返すのが正しいかどうかはおいといて
接尾文字のない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 さんの答えが適切でしょう。


KANAGAWA  2005-06-29 06:55:11  No: 58038

isshiさんtetrapodさん返信ありがとうございます。

基本的に16進定数はマイナス値が使えないと言うことでしょうか。
strtoi関数だと16進定数でもマイナス値が使えるのですが、32bit
マシーンにおいて、まだ_INT64には対応していないと言うことでしょうか。

とりあえず今回は、_strtoui64 で unsigned の値を得て、
signed に無理やり代入する事にします。


isshi  2005-06-29 18:43:05  No: 58039

>strtoi関数だと16進定数でもマイナス値が使えるのですが
そのような関数は VC には見当たらないのですが。
strtol のことだとしても、やはり16進文字列はマイナス値に変換されませんでした。(VC7.1)


KANAGAWA  2005-07-01 06:28:16  No: 58040

isshiさんありがとうございました。

すいません勘違いしてました。
strtolでも16進文字列はマイナス値に変換できませんね。

たびたびありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加