私は Google Goチュートリアル を読んでおり、定数セクションでこれを見ました:
0LLや0x0ULのような定数はありません
私はグーグル検索を試みましたが、出てくるのは人々がこれらの定数を使用している例ですが、それらが何を意味するのかについての説明はありません。 0xは16進数リテラルを開始することになっていますが、これらは16進数で使用できる文字ではありません。
これらは、CおよびC++の定数です。接尾辞LL
は定数がlong long
型であることを意味し、UL
はunsigned long
を意味します。
一般に、各L
またはl
はlong
を表し、各U
またはu
はunsigned
を表します。したがって、たとえば.
1uLL
タイプunsigned long long
の定数1を意味します。
これは、浮動小数点数にも適用されます。
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
したがって、サフィックスは必要ありません。
いくつかの基本的な数値タイプがあり、文字によって区別されます。
0 // normal number is interpreted as int
0L // ending with 'L' makes it a long
0LL // ending with 'LL' makes it long long
0UL // unsigned long
0.0 // decimal point makes it a double
0.0f // 'f' makes it a float
0LL
は長い長いゼロです。
0x0UL
は、16進表記を使用して表される、符号なしの長いゼロです。 0x0UL
== 0UL
。
LL
はリテラルをlong long
として指定し、UL
はリテラルをunsigned long
として指定し、0x0
は0
の16進数です。したがって、0LL
と0x0UL
は同等の数値ですが、データ型が異なります。前者はlong long
で、後者はunsigned long
です。
これらの指定子は多数あります。
1F // float
1L // long
1ull // unsigned long long
1.0 // double
+ Cのような言語では、これらの接尾辞は正確な型を示します。したがって、たとえば。 9はint
変数ですが、0LL
はlong long