1. ホーム
  2. c

[解決済み】0LLや0x0ULの意味は何ですか?

2022-02-12 15:08:59

質問事項

を読んでいます。 Google Goチュートリアル で、定数のところにこんなのがありました。

0LLや0x0ULのような定数はありません。

Googleで検索してみましたが、出てくるのはこれらの定数を使用している例ばかりで、どういう意味なのか説明がありません。0xは16進数リテラルを開始するためのものですが、これらは16進数で可能な文字ではありません。

どのように解決するのですか?

CやC++の定数です。接尾辞の LL は、その定数が long long であり、かつ UL とは unsigned long .

一般に、各 L または l を表します。 long と、それぞれの U または uunsigned . そのため、例えば

1uLL

は、定数 1 で型 unsigned long long .

これは浮動小数点数にも適用されます。

1.0f    // of type 'float'
1.0     // of type 'double'
1.0L    // of type 'long double'

と文字列と文字がありますが、これらは接頭辞です。

 'A'   // of type 'char'
L'A'   // of type 'wchar_t'
u'A'   // of type 'char16_t' (C++0x only)
U'A'   // of type 'char32_t' (C++0x only)


CとC++では、整数定数は元の型を使用して評価されるため、整数のオーバーフローによるバグが発生する可能性があります。

long long nanosec_wrong = 1000000000 * 600;
// ^ you'll get '-1295421440' since the constants are of type 'int'
//   which is usually only 32-bit long, not big enough to hold the result.

long long nanosec_correct = 1000000000LL * 600;
// ^ you'll correctly get '600000000000' with this

int secs = 600;
long long nanosec_2 = 1000000000LL * secs;
// ^ use the '1000000000LL' to ensure the multiplication is done as 'long long's.

Google Go では、すべての整数は大きな整数として評価されます (切り捨ては行われません)。

    var nanosec_correct int64 = 1000000000 * 600

で、"はありません。 通常演算の推進 "です。

    var b int32 = 600
    var a int64 = 1000000000 * b
    // ^ cannot use 1000000000 * b (type int32) as type int64 in assignment

というように、接尾辞は必要ありません。