C ++ целочисленный тип литерала [дубликат]

[[ является ключевым словом bash, аналогичным (но более мощным, чем) командой [.

См.

http://mywiki.wooledge.org/BashFAQ/031 и http://mywiki.wooledge.org/BashGuide / TestsAndConditionals

Если вы не пишете POSIX sh, мы рекомендуем [[.

8
задан Bathsheba 22 January 2016 в 12:26
поделиться

2 ответа

Поскольку это ошибка компилятора, этот ответ специфичен для MSVC, и он неверен с точки зрения iso C ++. Для правильного и стандартного ответа см. Ответ @Bathsheba. (я призываю OP принять правильный ответ вместо этого ответа для будущих читателей).


From MSDN :

Оценивается номер 2147483648. Поскольку он больше максимального целочисленного значения 2147483647, тип 2147483648 не является int, а unsigned int.

Другими словами, компилятор будет обрабатывать -2147483648 как - и 2147483648 не как -2147483648. Таким образом, часть 2147483648 считается unsigned int, так как она больше, чем int. и затем компилятор применяет оператор -, который приводит к этому предупреждению.

Решение:

auto test_case= -2147483648ll;
6
ответ дан Humam Helfawi 25 August 2018 в 22:50
поделиться

Это ошибка компилятора.

Первое, что нужно отметить: -2147483648 не является буквальным. В C ++ нет такой вещи, как отрицательный литерал.

-2147483648 - это константное выражение, оценивающее время компиляции, состоящее из 2147483648 и унарного оператора минуса.

В MSVC, ориентированном на Windows x64 ( где int и long являются 32 битами), 2147483648 должен быть long long int, и поэтому так будет -2147483648. Я понимаю, что стандарт настаивает на на подписанном типе , если только вы не используете шестнадцатеричный или восьмеричный литерал.

Сужение преобразования в signed int в этом случае, четко определен, так как вы нацеливаете платформу с 32-битным дополнением int.

Дополнительная ссылка: см. http://en.cppreference.com/w / CPP / язык / integer_literal

9
ответ дан Bathsheba 25 August 2018 в 22:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: