2011-08-12 5 views
12

Czytam Google Go tutorial i widziałem to w części stałych:Co oznaczają wartości 0LL lub 0x0UL?

Brak stałych jak 0LL lub 0x0UL

próbowałem zrobić wyszukiwania Google, ale wszystko, co pojawia się przypadki, w których ludzie używają tych stałych, ale nie mają żadnego wyjaśnienia, co oznaczają. 0x ma uruchomić literał szesnastkowy, ale nie są to znaki możliwe w postaci szesnastkowej.

+0

„Próbowałem zrobić wyszukiwania Google” ... spróbuj wyszukiwanie termin "całkowite stałe C++ LL". :) –

+0

Zawsze uważałem je za "literały" i stałe za zmienne zadeklarowane jako stałe. –

+0

Wystarczy, ale wyobrażam sobie, że wyniki dla 'literałów całkowitych C++ LL' są podobne ... :) –

Odpowiedz

20

Są to stałe w C i C++. Przyrostek LL oznacza stałą typu long long, a UL oznacza unsigned long.

Ogólnie, każdy L lub l oznacza long i każdy U lub u oznacza grupę unsigned. Tak więc np.

1uLL 

oznacza stałą 1 o typie unsigned long long.

Odnosi się to również do liczb zmiennoprzecinkowych:

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

i smyczki i znaków, ale są przedrostki:

'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) 

w C i C++ stałych całkowitych są oceniane przy użyciu swoich oryginalny typ, który może powodować błędy z powodu przekroczenia liczby całkowitej:

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. 

W Google Go, wszystkie liczby całkowite są oceniane jako wielkich liczb całkowitych (bez obcinania zdarza),

var nanosec_correct int64 = 1000000000 * 600 

i nie ma "usual arithmetic promotion"

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

tak przyrostki nie są konieczne.

2

0LL to długie długie zero.

0x0UL to niepodpisane długie zero, wyrażone za pomocą zapisu szesnastkowego. 0x0UL == 0UL.

2

LL oznacza dosłownym jako long long i UL oznacza jeden jako unsigned long i 0x0 jest szesnastkowa 0. Tak więc 0LL i 0x0UL są równoważną liczbą, ale różnymi typami danych; pierwszy to long long, a drugi to unsigned long.

Istnieje wiele z tych specyfikatorami:

1F // float 
1L // long 
1ull // unsigned long long 
1.0 // double 
+0

Nie ma czegoś takiego jak' 1D' w C lub C++. – kennytm

+0

@Kenny Och, nie ma? Czy 'x.x' służy wtedy temu celowi? Dzięki za informację, założyłem, że D był podwójny. –

+0

Tak, masz rację. – kennytm

2

+ W językach C-podobnych, te przyrostki wam dokładny typ. Na przykład.9 jest zmienną int, ale 0LL jest long long

4

Istnieje kilka różnych typów podstawowych numeryczne i litery je odróżnić:

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