Преобразование странных чисел C ++

Поэтому у меня есть следующий код:

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

использование пространства имен std ; 

int main () { 
    array < long , 3 > test_vars = { 121 , 319225 , 15241383936 }; для ( длительного test_var : test_vars ) { 
        соиЬ << test_var << ENDL ; } } prettyprinted ">
      
      
    
long

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

  1. 121
  2. 319225
  3. -1938485248

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

  1. 121
  2. 319225
  3. 15241383936

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

c++,numbers,long-integer,

2

Ответов: 1


7 принят

MSVC использует 4Byte long. Стандарт C ++ гарантирует, intчто он не меньше int. Поэтому максимальное число, представимое через a signed longis 2.147.483.647. То, что вы вводите, слишком велико, чтобы удерживать его, longи вам придется использовать больший тип данных с не менее 64 бит.

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

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

Ваша программа будет читать:

#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;
    }
}
C ++, цифры, длинное целое,
Похожие вопросы