2010-11-18 13 views
0

Eski Visual Studio 6'mda temel olarak şu şekilde görünen itow() öğesini çağırıyorum:İtow() için INT_SIZE_LENGTH 20, neden?

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

Şimdi INT_SIZE_LENGTH tanımına dikkat edin. Bu neden 20'ye ayarlandı?

Bir int32 için en kötü durum -4294967295 olmalıdır, sağ. Ve bu sadece 11 karakter artı \ 0. (Kendi arabam, _itow çağrısı, sadece 13 uzun. Ben yeterli olduğunu düşündüm.) Xzx30

(Olumlu bir int64 20 karaktere kadar, 21 kadar bir negatif olurdu. Ama bu yöntem için 32 bit tamsayılar. Xzx32

Burada bir şey özlüyorum gibi hissediyorum? Herhangi bir fikir minnetle alındı.

(Visual Studio 2008 koduna baktım ve kod tamamen yeniden yazıldı. Bu yüzden VS6 kodu o kadar iyi değil.)

+2

20 kesinlikle * yeterli değil * çünkü 'radix '2 olabilir. – kennytm

+0

En azından VC8 belgeleri" radix "*" 2–36 "* aralığında olmalıdır. –

+1

Evet, sanırım VC6'nın arabası olduğunu biliyordum ... – leiflundgren

cevap

3

o takdirde sigara ondalık sayılar yayabilir Muhtemelen çünkü radix, 10'dan küçüktür. Daha sonra basamak sayısı büyür. Diğer taraftan, bu, ikili çıkışı desteklemek için INT_SIZE_LENGTH'un 33 olması gerektiğini ima eder.

1

MSVC buggy; büyük sürpriz. Doğru bir uzunluk (isteğe bağlı temel destek için), minbase'un desteklemeniz gereken minimum temel olduğu sizeof(inttype)*CHAR_BIT/log2(minbase)+2 olacaktır. Tabii ki logaritmayı yuvarlayın.

İlgili konular