Kısa bir süre önce kodumda hata ayıklamak için birkaç saatimi alan bir hata buldum.Belirli örtülü tür dönüşümleri neden bir makinede güvenli ve başka bir yerde değil? Bu çapraz platform sorunlarını nasıl önleyebilirim?
unsigned int foo(unsigned int i){
long int v[]={i-1,i,i+1} ;
.
.
.
return x ; // evaluated by the function but not essential how for this problem.
}
v tanımı imzasız int örtük vardı benim geliştirme makinede (ubuntu 12.04 32 bit, g ++ derleyici), üzerinde herhangi bir soruna neden olmadı:
sorun bir fonksiyonu olarak tanımlandı uzun int'ye dönüştürülür ve bu şekilde negatif değerler doğru bir şekilde ele alınmıştır.
Farklı bir makinede (ubuntu 12.04 64 bit, g ++ derleyici) bu işlem güvenli değildi. I = 0 olduğunda, v [0] -1 olarak ayarlanmadı, ancak bazı garip büyük değere (genellikle imzasız bir int negatif yapmaya çalışırken olur).
Uzun int
long int v[]={(long int) i - 1, (long int) i, (long int) i + 1};
i değişkeninin değerini döküm sorununu çözebilir ve her şeyi (her iki makinelerde) gayet güzel çalıştı.
İlk makinenin neden iyi çalıştığını anlayamıyorum ve diğer makinede çalışmaz.
Bunu anlamama yardımcı olabilir misiniz, böylece gelecekte bu veya diğer sorunlardan kaçınabileceğim için?
Açıklama için teşekkürler, cevabınızı çok iyi anlayamadım.Tamamen emin değilim, ama uzun int imzasız int içerecek kadar büyük olduğunu hatırlıyorum (en azından online bulabileceğiniz bazı C++ referanslarına göre). Her neyse, onları karıştırmamak için iyi bir uygulama olduğuna katılıyorum, ama bu durumda benim için gerekli. Makine ile ilgili sorunların ne zaman ortaya çıkabileceğini merak ettim. – lucacerone