INT_SIZE_LENGTH для itow () - 20, почему? - PullRequest
0 голосов
/ 18 ноября 2010

В моей старой Visual Studio 6 я обнаружил, что вызов itow () выглядит примерно так:

#define INT_SIZE_LENGTH 20

wchar_t* _itow(wchar_t*bif, int i, int radix)
{
   char abuf[INT_SIZE_LENGTH];
   itoa(abuf, i, radix);
   // convert_to_wide_char();
}

Теперь обратите внимание на определение INT_SIZE_LENGTH. Почему это установлено на 20?

Наихудший случай для int32 должен быть -4294967295, верно. И это только 11 символов, плюс \ 0. (В моем собственном буфере при вызове _itow длина всего 13. Я подумал, что этого достаточно.)

(положительное значение int64 будет содержать до 20 символов, отрицательное - до 21. Но это метод для 32-разрядных целых чисел.)

Я чувствую, что что-то здесь упускаю? Любые идеи с благодарностью принимаются.

(Я посмотрел код из Visual Studio 2008, и там код был полностью переписан. Поэтому я думаю, что код VS6 не очень хорош.)

Ответы [ 2 ]

3 голосов
/ 18 ноября 2010

Возможно, потому что он может испускать недесятичные числа, если radix меньше 10. Тогда число цифр растет. С другой стороны, это будет означать, что INT_SIZE_LENGTH должно быть 33, чтобы поддерживать двоичный вывод.

1 голос
/ 18 ноября 2010

MSVC глючит;большой сюрприз.Правильная длина (для произвольной поддержки базы) будет sizeof(inttype)*CHAR_BIT/log2(minbase)+2, где minbase - минимальная база, которую вам нужно поддерживать.Конечно, округлите логарифм вниз.

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