strtol не обнаруживает целочисленное переполнение - PullRequest
0 голосов
/ 25 октября 2011

Я пытаюсь преобразовать массив символов в целое число, используя strtol, используя следующий код:

int foo = strtol(temp, (char **)NULL, 0);

Где temp = 4000000010

Однако strtol не обнаруживает переполнение, онне устанавливает для foo значение LONG_MAX и значение errno не изменяется с его начального значения 0.

Вместо этого значение bob изменяется на переполненное значение -294967286.

Поэтому мне было интересно, чего мне не хватаетздесь

Ответы [ 3 ]

3 голосов
/ 25 октября 2011

Вероятно, переполнение происходит при неявном преобразовании long в int в вашем выражении, а не внутри strtol().

0 голосов
/ 25 октября 2011
  • Нельзя хранить переменную 4 * 10 ^ 9 в 32-битной длине. long подписывается по умолчанию.
  • Максимальное значение long - (2 ^ 32/2) -1 = 2147483674, при условии, что long - 32 бит в вашей системе.
  • Используйте взамен strtoul ().
  • Изменить foo на unsigned long .
0 голосов
/ 25 октября 2011

Если вы знаете, что получите большие числа, почему бы не использовать strtoll вместо этого?Конечно, как отметили другие, вы не можете использовать int для сохранения результата.

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