"strtol" возвращает разные значения - PullRequest
0 голосов
/ 23 октября 2019

Может ли кто-нибудь помочь мне понять, почему я вижу разные результаты для одного и того же входа? вывод "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;

1 Ответ

1 голос
/ 23 октября 2019

strtol и strtoul - это разные функции, которые ведут себя по-разному и возвращают разные вещи.

Если вы вызываете strtol на 0xFFFFFFFF, тогда результат (в зависимости от платформы) может быть вышедиапазон, который может держать long. Как видно из здесь , в этом случае будет возвращено значение LONG_MAX и будет установлено errno.

Однако, когда вы вызываете strtoul, 0xFFFFFFFFвероятно, будет в диапазоне на большинстве платформ и просто вернет вам правильный результат.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...