2016-06-21 3 views
-2

Мне было поручено реализовать itoa, мой код не работает с -2147483648. Как я могу заставить это работать?my itoa не работает с большими номерами

char *itoa(int nbr) 
{ 
    static char rep[] = ""; 
    static char buff[65]; 
    char  *ptr; 
    int   neg; 

    ptr = &buff[64]; 
    *ptr = '\0'; 
    neg = nbr; 
    // fails here, turning -2147483648 to int 
    //2147483648 is bigger than int. 
    if (nbr < 0) 
     nbr *= -1; 
    if (nbr == 0) 
     *--ptr = rep[nbr % 10]; 
    while (nbr != 0) 
    { 
     *--ptr = rep[nbr % 10]; 
     nbr /= 10; 
    } 
    if (neg < 0) 
     *--ptr = '-'; 
    return (ptr); 
} 
+3

узнать о пределах ...... –

+0

'длинного типа long' – infixed

+0

я не могу использовать' long' моего прототип функции требует 'nbr' быть' int'. –

ответ

1

Вы пытаетесь конвертировать -2147483648 до 2147483648 с помощью следующего кода

if (nbr < 0) 
    nbr *= -1; 

2147483648 не поместятся в int в вашей системе. Возможно, вы захотите преобразовать nbr в тип, такой как long long, который может обрабатывать большее значение перед выполнением этой операции.

long long my_positive = nbr; 
if (my_positive < 0) 
     my_positive*= -1; 
+0

Извините, но как это помогает решить проблему? вы можете уточнить, пожалуйста? –

+0

OP algo не работает, когда целое число ввода равно -2147483648, потому что algo пытается преобразовать его в 2147483648. 'int' не обрабатывает такое значение в системе OP. Стандарт C99 указывает, что 'long long' должен иметь возможность обрабатывать хотя бы значение до 9223372036854775807. Используя' long long' в algo, решим вопрос, на который ссылается OP. –

0

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

Смежные вопросы