Эта линия:
if (x == -2147483648)
не делать то, что вы думаете, что он делает. C не имеет отрицательных целых констант. Это unsigned int constant со значением 2^31, на который вы применили унарный оператор минус. Это означает, что выражение x == -21...
будет зависеть от стандарта C, который использует ваш компилятор.
Если вы используете C99 или C11, все будет в порядке. Существует большой тип подписанного типа - длинный длинный гарантированно будет достаточно большим для этого числа, поэтому и x, и -21 ... будут преобразованы в длинный, а затем сравнимый. Но если вы используете C89 компилятор и ваш компьютер не имеет достаточно длинный типа, вы ударяя определенную реализацию поведения здесь:
Когда целый понижен до целого числа с меньшим размером, или целое число без знака преобразуется в соответствующее соответствующее целое число со знаком, если значение не может быть представлено, результат определяется реализацией.
Вот почему люди говорят, что используют limits.h. Не потому, что они педантичны, а потому, что это опасная территория. Если вы внимательно посмотрите на то, что limits.h содержит, вы, скорее всего, найти такую строку:
#define INT_MIN (- INT_MAX - 1)
Это выражение на самом деле имеет правильный тип и значение.
Кроме этого, я не вижу ошибок в отправленном вами коде. Если это не проблема, то ft_intlen
или ft_strdup
ошибочны. Или вы вызываете свою функцию при неправильном тестировании (те же проблемы применяются к -21 ... при вызове тестов).
Необходимо ввести полный код для функции ft_intlen –
, который является полным кодом, strdup просто выделяет строку, ft_intlen просто возвращает длину строки, оба передают тестовые примеры – franklinexpress
Каков размер int в вашей системе? –