【发布时间】:2020-02-19 08:09:11
【问题描述】:
有人能帮我理解为什么我看到相同输入的不同输出吗? “n”的输出是 2147483647,这是不正确的。为什么?
-------- 输出 ----------
FF
FF
FF
FF
FFFFFF
16777215
16777215
--------- 代码 ------------------------- --------------------------------
string s="FF FF FF FF";
std::stringstream ss(s);
std::istream_iterator<std::string> begin(ss);
std::istream_iterator<std::string> end;
std::vector<std::string> vstrings(begin, end);
std::copy(vstrings.begin(), vstrings.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
printf("\n");
string str2=vstrings[0]+vstrings[1]+vstrings[2]+vstrings[3];
cout<<str2<<endl;
unsigned long n = strtol( str2.c_str(), 0, 16 );
cout<<n<<endl;
string s1 = "ffffffff";
unsigned long n1 = strtoul( s1.c_str(), 0, 16 );
cout << n1 << endl;
【问题讨论】:
-
更正! “n”的输出 = 2147483647,“n1”的输出 = 4294967295。如果 input="ffffff",则两个输出相同。
-
您最好通过编辑问题文本进行更正。
-
您正在使用两个不同的函数,
strtoul处理无符号值,strtol处理有符号值。如果您使用的是long具有 32 位的 Windows,那么您就会遇到问题,因为有符号的FFFFFFFF是 -1。如果您想获得正确的第一个结果,请使用strtoll并将结果保存在long long。 -
一个错字:
strtol和strtoul?如果是有意的,FFFFFFFF不能完全由strtol呈现,因为它大于您平台上signed long的最大值。 -
对不起,我忽略了不同的功能。下次一定要小心