尝试在C ++ 11中将字符数组转换为int数据类型。为什么int
值i
与字符数组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
答案 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
太小,无法存储51093843802
(range of values)。使用atoll
(很长很长)并将i的类型替换为int64_t
:
char value[] = "51093843802";
printf("%s\n", value);
int64_t i = std::atoll(value);
printf("%ld\n", i);
将long
与atol
一起使用是不安全的,因为即使在64位系统上,Windows long
的大小也为4字节。