atoi () выдает неверное значение при применении к большому аргументу командной строки - PullRequest
0 голосов
/ 16 июня 2020

Я прочитал значение 300000000000 из командной строки и использую atoi для преобразования его в int64_t, однако он выводит неправильное значение.

int main(int argc, char * const argv[]){
  int64_t timeSlice = -1;

  if(argc == 4){
      timeSlice = atoi(argv[1])
      cout<<"timeslice: "<<timeSlice<<endl;

  }
}

Я запускаю свою программу с номером 300000000000

Ожидаемый результат: timeSlice: 300000000000 Фактический результат: timeslice: -647710720 Я даже пробовал использовать строковый поток, и он работал, но когда я передал временной интервал другой функции, значение в этой функции все еще было неправильным

Ответы [ 2 ]

0 голосов
/ 16 июня 2020

Это действительно зависит от того, используете ли вы 32-битную или 64-битную систему и используете ли вы Windows или Linux

atoi, atol, strtol и strtold вернут 32-битные число в 32-битном исполняемом файле.

atoll, strtoll вернет 64-битное число как для 32-битных, так и для 64-битных исполняемых файлов

atol, strtol, strtold вернет 32-битное число в 64-битный Windows исполняемый файл, но 64-битный номер в 64-битном Linux исполняемом файле.

64-битный windows исполняемый файл, long = int, 64-битный linux исполняемый файл long = long длинный

0 голосов
/ 16 июня 2020

Используйте strtoll функцию:

timeSlice = strtoll(argv[1], nullptr, 10);
...