Странное Преобразование Чисел C ++ - PullRequest
0 голосов
/ 24 августа 2018

Итак, у меня есть следующий код:

#include <iostream>
#include <string>
#include <array>

using namespace std;

int main()
{
    array<long, 3> test_vars = { 121, 319225, 15241383936 };
    for (long test_var : test_vars) {
        cout << test_var << endl;
    }
}

В Visual Studio я получаю этот вывод:

  1. 121
  2. 319225
  3. -1938485248

Тот же код, выполненный на сайте cpp.sh, дал следующий вывод:

  1. 121
  2. 319225
  3. 15241383936

Я ожидаю, что выходные данные будут такими же, как в cpp.sh.Я не понимаю вывод из Visual Studio.Это возможно что-то простое;но я был бы признателен, если бы кто-нибудь сказал мне, что случилось.Это стало для меня настоящим источником раздражения.

1 Ответ

0 голосов
/ 24 августа 2018

MSVC использует 4 байта long.Стандарт C ++ гарантирует, что long будет иметь размер не менее 1003 *.Следовательно, максимальное число, представимое signed long, равно 2.147.483.647.То, что вы вводите, слишком велико для long, и вам придется использовать больший тип данных с как минимум 64-битным.

Другой компилятор использовал 64-битную ширину long, поэтому он работалтам.

Вы можете использовать int64_t, который определен в cstdint header .Что гарантировало бы 64-битный размер подписанного целого.

Ваша программа будет выглядеть так:

#include <cstdint>
#include <iostream>
#include <array>

using namespace std;

int main()
{
    array<int64_t, 3> test_vars = { 121, 319225, 15241383936 };
    for (int64_t test_var : test_vars) {
        cout << test_var << endl;
    }
}
...