atoi() 在应用于大型命令行参数时会产生不正确的值

atoi() produces incorrect value when applied to a large command line argument

本文关键字:不正确 参数 应用于 命令行 大型 atoi      更新时间:2023-10-16

我从命令行读取值 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我什至尝试使用字符串流并且可以工作,但是当我将时间片传递给另一个函数时,该函数中的值仍然错误

使用strtoll函数:

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

这实际上取决于您使用的是 32 位还是 64 位系统,以及您使用的是 Windows 还是 Linux

Atoi,Atol,Strtol和Strold都将在32位可执行文件上返回32位数字。

环礁,strtoll 将在 32 位和 64 位可执行文件上返回 64 位数字

atol,strtol,strtold 将在 64 位 Windows 可执行文件上返回 32 位数字,但在 64 位 Linux 可执行文件上返回 64 位数字。

在 64 位 Windows 可执行文件上,long=int,64 位 linux 可执行文件 long=long long