2016-04-13 2 views
-1

У меня есть некоторые длинные постоянные для границ в моих вычислениях. Теперь у меня есть проводка, потому что некоторые условия недействительны, потому что числа «missinterpreted» Первый вывод - это номер, который я хочу использовать .... на выходе вы можете видеть, что знак - удален, поэтому я подумал о опустошение, но когда я добавить 0, так что число еще выше, выход правильно ....C++ Visual Studio внятно поведение знакового целого

Я использую Visual Studio 2012

cout<<-2147483648<<endl; 
cout<<-2147483649<<endl; 
cout<<-21474836480<<endl; 
cout<<-21474836490<<endl; 
cout<<-214748364800<<endl; 
cout<<-214748364900<<endl; 

, как вы можете видеть, в первые 2 строки - знак снят

2147483648 
2147483647 
-21474836480 
-21474836490 
-214748364800 
-214748364900 

любая идея, в чем проблема?

+0

https://en.wikipedia.org/wiki/Integer_overflow – Boiethios

+0

Ваш пример не даже компиляции в VS2012 , Он не работает со следующим сообщением об ошибке для этих двух строк: 'ошибка C4146: оператор унарного минуса, примененный к неподписанному типу, результат все равно неподписан. –

ответ

1

Вы должны внимательно изучить предупреждения, предоставленные вашим компилятором. Если ваш код не создает никаких предупреждений, вам следует увеличить уровень генерации предупреждений для вашего компилятора. Этот код на MSVC компилятора будет производить два предупреждения:

предупреждение C4146: унарный минус применяется к неподписанному типу, в результате все еще неподписанных

Который в основном означает, что компилятор угрозу первых два значения, unsigned int, затем примените к нему унарный минус-оператор. Чтобы решить эту проблему, вы должны неявно объявить тип значения:

cout << -(long long)2147483649 << endl; 
+0

thx alot! Мне даже придется долгое время тестировать = - (long long) 2147483648 – user2071938

+1

Где суффикс 'LL' - это, вероятно, способ пойти (вместо актерского), и если вы используете компилятор последнего времени, вы можете просто сделать:' auto value = -214748364900LL; ' – Pixelchemist

2

Предупреждения компилятора не должны игнорироваться!

Поскольку вы не суффиктируете целые литеры, компилятор использует int для значений, меньших INT_MAX и unsigned int для значений между INT_MAX и UINT_MAX. Предполагая, что 32-битная платформа с 2-мя дополнениями, INT_MAX равна 2147483647, поэтому 2147483648 и 2147483648 являются неподписанными и, как сказано предупреждением, применение знака «минус» к неподписанному типу все равно дает положительное значение. Таким образом, результаты вызваны переполнением.

Правильный путь к суффиксом litteral с L для long и LL для long long:

cout<<-2147483648LL<<endl; 
cout<<-2147483649LL<<endl; 
cout<<-21474836480LL<<endl; 
cout<<-21474836490LL<<endl; 
cout<<-214748364800LL<<endl; 
cout<<-214748364900LL<<endl; 
Смежные вопросы