функция strtol в C вне диапазона или нет

Я пытаюсь прочитать число из строки с помощью strtol(), и оно возвращает число LONG_MAX, которое должно возвращаться, когда число выходит за пределы допустимого диапазона, но мое число не такое уж большое

main(){
    char linea[30]={"110111010111111000000000"};
    long num=strtol(linea,NULL,0);
    printf("%s\n%X",linea,num);
}

Фактический результат:
1101110101111111000000000
7FFFFFFFF

Необходимый результат:
110111010111111000000000
DD7C00


person Mark E    schedule 01.06.2012    source источник
comment
@pyCthon - рекомендуется не включать шаблон при публикации в SO. вы должны #include ‹stdio.h› и #include ‹stdlib.h›   -  person djechlin    schedule 01.06.2012


Ответы (2)


Согласно справочной странице для strtol, указанный вами аргумент «0» означает «использовать наилучшее суждение», которое в данном случае является десятичным. Если вы хотите, чтобы он преобразовывал двоичное число, как подсказывает указанный вами «Необходимый результат», не используйте «0», используйте «2».

person brepro    schedule 01.06.2012

наверное потому что ты проходишь по базе 0

пытаться:

int main(){
    char linea[30] = {"110111010111111000000000"};
    long num       = strtol(linea, NULL, 10);
    printf("%s\n%X", linea, num);
}

EDIT Очевидно, основание 0 — это специальное значение для функции strtol:

Если значение базы равно 0, ожидаемая форма подлежащей последовательности — это десятичная константа, восьмеричная константа или шестнадцатеричная константа, любой из которых может предшествовать знак «+» или «-».

Так что я думаю, вы можете использовать 0, извините за сомнения.

person Hunter McMillen    schedule 01.06.2012
comment
@Als хм, ну, очевидно, 0 - это особое значение, о котором я не знал, пока вы не спросили меня. Спасибо, плохо отредактировал выше. - person Hunter McMillen; 01.06.2012
comment
Судя по ожидаемому результату, кажется, что он хочет, чтобы ввод интерпретировался как основание 2. - person David Gelhar; 01.06.2012
comment
Да, база была на самом деле 2, но это была проблема, я не знаю, как я не видел - person Mark E; 01.06.2012
comment
Пожалуйста, отредактируйте свой ответ, чтобы добавить решение проблемы OP, которое вы вскоре поняли, и я поддержу ваш ответ, чтобы свести на нет чье-то поспешное отрицание вашего ответа. - person Alok Save; 01.06.2012