2010-11-18 2 views
0

Dans mon ancien Visual Studio 6 Je trouve que l'appel itow(), qui ressemble fondamentalement ceci:INT_SIZE_LENGTH pour itow() vaut 20, pourquoi?

#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(); 
} 

Maintenant, remarquez le define INT_SIZE_LENGTH. Pourquoi est-ce réglé à 20?

Le pire des cas pour un int32 devrait être -4294967295, à droite. Et ce n'est que 11 caractères, plus \ 0. (Mon propre tampon, dans l'appel de _itow, n'est que long 13. Je pensais que c'était suffisant.)

(Un int64 positif serait jusqu'à 20 caractères, un négatif jusqu'à 21. Mais c'est la méthode pour Entiers 32 bits.)

Je sens qu'il me manque quelque chose ici? Toutes les idées reçues avec reconnaissance.

(j'ai regardé le code de Visual Studio 2008, et le code a été complètement réécrite. Je suppose que le code VS6 est pas bon.)

+2

20 est certainement * insuffisant * car 'radix' pourrait être 2. – kennytm

+0

Au moins la documentation de VC8 indique que' radix' * "doit être compris entre 2 et 36" *. –

+1

Eh bien, je suppose que je savais que VC6 était bogué ... – leiflundgren

Répondre

3

Probablement parce qu'il peut émettre un nombre non décimales, si radix est inférieur à 10. Ensuite, le nombre de chiffres augmente. D'un autre côté, cela impliquerait que INT_SIZE_LENGTH devrait être 33, pour supporter la sortie binaire.

1

MSVC est buggé; grosse surprise. Une longueur correcte (pour un support de base arbitraire) serait sizeof(inttype)*CHAR_BIT/log2(minbase)+2, où minbase est la base minimale que vous devez prendre en charge. Arrondissez le logarithme, bien sûr.

Questions connexes