Нужны ли long-суффикс и unsigned-суффикс при объявлении длинных литералов в C ++? - PullRequest
2 голосов
/ 10 июня 2009

У меня есть древние воспоминания о написании кода на C, например:

long value = 0;

в старые дурные времена Win16 и заканчивалось тем, что value был только наполовину инициализирован: то есть младшие 16 бит были 0, а верхние 16 бит были любыми случайными битами, которые были в этом месте в памяти. Таким образом, я стал условно писать:

long value = 0L;

Требуется ли это в наши дни под C99 и / или C ++? Я знаю, что ILP32 указывает, что int и long являются 32-разрядными, но предположим, что мы используем, скажем, LP64, где int s являются 32-разрядными, а long s - 64-разрядными. Требуются ли суффиксы или современные формы C и C ++ неявно расширяют литералы до длины переменной, которой они назначаются?

Как насчет беззнаковых значений? То есть это требуется?

unsigned long value = 0UL;

Ответы [ 4 ]

7 голосов
/ 10 июня 2009

Они не требуются в приведенных вами примерах. Тем не менее, они могут быть необходимы в некоторых несколько редких обстоятельствах. Например, следующее может давать разные значения:

sizeof(1)
sizeof(1L)
3 голосов
/ 10 июня 2009

Нет, это больше не требуется. Поведение, которое вы описываете, если оно отображается в программе, а не только в отладчике, - ошибка

1 голос
/ 25 июля 2014

Но эта запись обязательна для строк wchar_t, например

L"I am a wchar_t string."

и для длинных длинных целых тоже ...

Полагаю, это то, что нужно удалить, это бесполезно (тип объявлен с его именем, а не с каким-либо суффиксом), но все еще поддерживается в C ++ 11.

Hm.

1 голос
/ 06 декабря 2012

Так как вы предполагаете 32-битный компилятор, вам может не понадобиться L, как вы использовали при использовании 16-битного компилятора, но вам может понадобиться LL, например ::100100

long long ll;
ll = 1<<32;

gcc -std = c99 предупреждает "счетчик смещения влево> = ширина типа". Вместо этого вы бы хотели:

ll = 1LL<<32;

См. Также https://stackoverflow.com/a/8108658/782738, для стандартных ссылок C ++ 11 и C99.

...