使用atoi将字符数组转换为int可以得到不同的值

时间:2019-07-25 20:22:39

标签: c++ c++11

尝试在C ++ 11中将字符数组转换为int数据类型。为什么inti与字符数组value不同?是因为51,093,843,802大于2,147,483,647吗?

// Example program
#include <iostream>
#include <string>

int main()
{
    char value[] = "51093843802";
    printf("%s\n", value);
    int i = std::atoi(value);
    printf("%d\n", i);
}

输出:

51093843802
-445763750

2 个答案:

答案 0 :(得分:3)

正如您所说,值51093843802不能(通常)适合int,在C ++中,溢出有符号整数为undefined behavior(因此是一个很大的否定)。

您需要使用long long int(如果您使用的是a system where that's 64 bits,则只需long int即可)

#include <iostream>
#include <string>

int main()
{
    char value[] = "51093843802";
    std::cout << value << '\n';
    long long i = std::stoll(value);
    std::cout << i << '\n';
}
  

输出:

51093843802
51093843802

请注意,我将i的数据类型更改为long long,将std::atoi更改为std::stoll,并将printf更改为std::cout,符合C ++最佳实践。

答案 1 :(得分:1)

int太小,无法存储51093843802range of values)。使用atoll(很长很长)并将i的类型替换为int64_t

char value[] = "51093843802";
printf("%s\n", value);
int64_t i = std::atoll(value);
printf("%ld\n", i);

longatol一起使用是不安全的,因为即使在64位系统上,Windows long的大小也为4字节。