itow()的INT_SIZE_LENGTH是20,为什么?

时间:2010-11-18 19:39:16

标签: c visual-c++

在我的旧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 个答案:

答案 0 :(得分:3)

可能是因为它可以发出非十进制数,如果radix小于10.那么数字的位数会增加。另一方面,这意味着INT_SIZE_LENGTH应为33,以支持二进制输出。

答案 1 :(得分:1)

MSVC有缺陷;大惊喜。正确的长度(对于任意基本支持)将是sizeof(inttype)*CHAR_BIT/log2(minbase)+2,其中minbase是您需要支持的最小基数。当然,将对数向下舍入。