Что означают 0LL или 0x0UL? - PullRequest
17 голосов
/ 12 августа 2011

Я читаю Google Go учебник и увидел это в разделе констант:

Нет таких констант, как 0LL или 0x0UL

Я попытался выполнить поиск в Google, но все, что появляется, - это случаи, когда люди используют эти константы, но без объяснения их значения.0x должен начинать шестнадцатеричный литерал, но это не символы, которые возможны в шестнадцатеричном числе.

Ответы [ 5 ]

26 голосов
/ 12 августа 2011

Это константы в C и C ++.Суффикс LL означает, что константа имеет тип long long, а UL означает unsigned long.

Как правило, каждый L или l представляет long, а каждый U или u представляет unsigned.Так, например,

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

, поэтомусуффиксы не нужны.

6 голосов
/ 12 августа 2011

Существует несколько различных основных числовых типов, и буквы различают их:

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
3 голосов
/ 12 августа 2011

LL обозначает литерал как long long, а UL обозначает его как unsigned long, а 0x0 является шестнадцатеричным для 0.Так что 0LL и 0x0UL - эквивалентное число, но разные типы данных;первый - long long, а второй - unsigned long.

Существует много таких спецификаторов:

1F // float
1L // long
1ull // unsigned long long
1.0 // double
3 голосов
/ 12 августа 2011

0LL - длинный длинный ноль.

0x0UL - длинный ноль без знака, выраженный в шестнадцатеричной записи.0x0UL == 0UL.

2 голосов
/ 12 августа 2011

+ В C-подобных языках эти суффиксы сообщают вам точный тип. Так, к примеру. 9 - переменная int, но 0LL - long long

...