2017-08-18 5 views
0

私は64ビットの16進数文字列で作業していますが、uint64_tの数値を7fよりも高くしたい場合は...正しい番号に変換されません。 私は英語じゃないので、私はコードの一部で、より良い問題を示すことができると思う:7FF ... 64ビットとuint64_t型より高い16進値を扱う方法

void testing() 
    { 
     std::string str = "cba321456789654a"; 
     uint64_t res = std::strtol(str.c_str(), NULL, 16); 
     cout << "RESULT " << std::hex << res << endl; 
    } 

そして、私は取得していた結果は次のとおりです。

RESULT 7fffffffffffffff 

私は変更する必要がありますか私の変数の型はより大きなintに?または、uit64_tを使用してこの問題を解決する方法がありますか?

答えて

1

あなたは署名なしを扱っていますが、文字列から符号付きの変換ルーチンを使用しています。そして、正しいタイプに変換していません。 strtolは32ビット長に変換されます。

uint64_t res = std::strtol(str.c_str(), NULL, 16); 

uint64_t res = std::strtoull(str.c_str(), NULL, 16); 

ここでは、C++文字列からint型変換ルーチンのドキュメントへのリンクです読んでください。私は知らないので、Cについて話す

http://en.cppreference.com/w/cpp/string/byte/strtoul

0

を( C++に関することですが、C++にも当てはまると思います)

strtol()は、int(すべてのプラットフォームで64ビット幅ではないbtw)を返します。したがって、ドメインは(0x4baの幅を仮定して)int [INT_MIN,INT_MAX] = [-0x8000000000000000,0x7fffffffffffff]ですので、0xcba321456789654aは返されません。

POSIXとC99には、あなたが欲しい、つまり符号なしの型を返さなければならない機能strtoull()があります。

別の方法としては、

sscanf("cba321456789654a", "%llx", &res); 

です。

関連する問題