1. ホーム
  2. c++

[解決済み] uint64_t定数はどのように定義するのですか?

2022-02-14 18:24:18

質問

C++プログラム(clang 6.0.1 in QtCreator 4.6.1)でuint64_t定数を使用しています。

例えば

uint64_t a = 0xffffffffffffffffULL;

問題は、IDEで以下の警告が表示されることです。

Warning: implicit conversion from 'unsigned long long' to 'uint64_t' (aka 'unsigned long')

また、次のように変更してみましたが、うまくいきませんでした。

uint64_t a = UINT64_C(0xffffffffffffffff);
uint64_t a = 0xffffffffffffffffUL;

C++14標準とオプションで計算するオプションがあります。 -Wconstant-conversion

型の大きさを確認する。

std::cout << "uint64_t " << sizeof (uint64_t) << std::endl; 
std::cout << "unsigned long " << sizeof (unsigned long) << std::endl;
std::cout << "unsigned long long " << sizeof (unsigned long long) << std::endl;

結果

uint64_t 8  
unsigned long 8
unsigned long long 8

これを修正する方法と、IDEがサイズ変換が起こっていると考える理由について、何か思い当たることはありますか?

編集:今、マクロ展開を確認しました。

define UINT64_C(c)  c ## UL

つまり、この例はうまくいくはずなのですが、うまくいきません。

uint64_t a = 0xffffffffffffffffUL;

解決方法は?

この警告は @hvd さんのコメントで解決しました。

インクルードされている全てのヘッダーファイルを確認しました。何らかの理由で、両方の stdint.hcstdint が含まれていました。のみを残しました。 cstdint . これらは、おそらく異なるプラットフォームのもので、定義も異なるのでしょう。

動作例です。

uint64_t v0 = UINT64_C(0x736f6d6570736575);