2010-11-18 14 views
0

In meinem alten Visual Studio fand ich, dass Aufruf itow(), die im Wesentlichen wie folgt aussieht:INT_SIZE_LENGTH für itow() ist 20, warum? 6

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

Nun bemerken die INT_SIZE_LENGTH definieren. Warum ist dies auf 20 eingestellt?

Worst Case für ein int32 sollte -4294967295, richtig sein. Und das sind nur 11 Zeichen, plus \ 0. (Mein eigener Puffer, im Aufruf von _itow, ist nur 13 lang. Ich dachte, das war ausreichend.)

(Ein positives int64 wäre bis zu 20 Zeichen, ein negativer Wert bis 21. Aber das ist die Methode für 32-Bit-Ganzzahlen.)

Ich fühle mich wie etwas hier fehlt? Irgendwelche Ideen dankbar erhalten.

(I am Code von Visual Studio sah 2008, und der Code komplett neu geschrieben wurde. Also ich denke, das VS6 Code ist nicht so gut.)

+2

20 ist definitiv * nicht genug * weil 'radix' 2 sein könnte. – kennytm

+0

Zumindest die VC8-Dokumentation besagt, dass' radix' * "im Bereich von 2-36" * liegen muss. –

+1

Nun, ich wusste, dass VC6 fehlerhaft war ... – leiflundgren

Antwort

3

Wahrscheinlich, weil es nicht Dezimalzahlen emittieren kann, wenn ist kleiner als 10. Dann wächst die Anzahl der Ziffern. Auf der anderen Seite würde dies bedeuten, dass INT_SIZE_LENGTH 33 sein sollte, um die binäre Ausgabe zu unterstützen.

1

MSVC ist fehlerhaft; große Überraschung. Eine korrekte Länge (für eine beliebige Basisunterstützung) wäre , wobei minbase die minimale Basis ist, die Sie unterstützen müssen. Runden Sie den Logarithmus natürlich ab.

Verwandte Themen