İki tane int değerin ortalamasını hesaplamak için (a+b)/2 yazmanın sakıncaları vardır. Eğer toplam, bir int'in alabileceği en yüksek değeri aşarsa, yani taşarsa, ortalama eksi bir değer olarak hesaplanır.
Örneğin int'in 32 bit olduğu bir ortamda, şu programın sonucu, 1.5 milyar olması gerekirken -647483648 çıkar:
Bunun önüne geçmek için ((unsigned int)a+b)/2) gibi yollar düşünülebilir. Bunlardan bir tanesiyle bugüne kadar karşılaşmamıştım:Kod:#include <stdio.h> int main() { int a = 1400000000; int b = 1600000000; int ortalama = (a + b) / 2; printf("%d\n", ortalama); return 0; }
O kod da iki sayının ortalamasını alır ama taşma sorunu yoktur! Çok ilginç...Kod:int ortalama = (a & b) + ((a ^ b) >> 1);
Nasıl çalıştığını anlayabiliyor musunuz?
Ali


LinkBack URL
About LinkBacks
Alıntı Yaparak Yanıtla


Bookmarks