【问题标题】:"strtol" return different values"strtol" 返回不同的值
【发布时间】: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 的最大值。
  • 对不起,我忽略了不同的功能。下次一定要小心

标签: c++ eclipse


【解决方案1】:

strtol 和 strtoul 是不同的函数,它们以不同的方式运行并返回不同的东西。

如果您在0xFFFFFFFF 上调用strtol,则结果可能(取决于平台)超出long 可以容纳的范围。从here 可以看出,在这种情况下,返回的值将是LONG_MAX,并且将设置errno。

但是,当您调用 strtoul 时,0xFFFFFFFF 在大多数平台上可能都在范围内,并且只会返回正确的结果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-02
    • 2018-12-08
    • 2014-03-29
    相关资源
    最近更新 更多