Visual Studio 2008 SP1 — Ошибка при управлении целыми числами с использованием C ++ и VS2008?

Я отлаживал программу на C ++ и обнаружил, что по какой-то причине в моей версии visual studio 2008 некоторые числа не сохраняются правильно. Например, число -3254535440, похоже, хранится как 1040431856. Эти числа достаточно малы, чтобы их можно было хранить в long long, поэтому проблем быть не должно. Если я запускаю следующий код, отображаются оба сообщения об ошибках. Я пробовал на двух разных машинах. Любая идея? Спасибо!

if (-3254535440 == 1040431856)
printf("ERROR\n");

long long j = -3254535440;
if (j == 1040431856)
printf("ERROR2\n");

Протестировано под Microsoft Visual Studio 2008 версии 9.0.30729.1 SP

-2

Решение

Литералы все еще ints. Вы должны сделать их более крупным шрифтом:

long long j = -3254535440LL;

Это не вписывается в 32-битный тип (который, кажется, ваш int есть), но когда-то представлен как long long, он сохраняет свою ценность.

4

Другие решения

Скомпилируйте с более высоким уровнем предупреждения, и вы получите предупреждение:

#include <stdio.h>

int main()
{
long long j = -3254535440;
printf("%lld\n",j);
}

Составитель:

c:\>cl /nologo /W4 test.cpp
test.cpp
test.cpp(5) : warning C4146: unary minus operator applied to unsigned type, result still unsigned

c:\>test
1040431856

Как уже упоминалось, объявите вместо этого длинный длинный литерал:

#include <stdio.h>

int main()
{
long long j = -3254535440LL;
printf("%lld\n",j);
}

Результат:

c:\>cl /nologo /W4 test.cpp
test.cpp

c:\>test
-3254535440
2

По вопросам рекламы [email protected]