2013-04-12 26 views
12

varsayalımuzun uzun 8 bayt, ancak tamsayı taşımı alıyorum?

long long b = 5*1024*1024*1024; // 5 gigs, small enough for 64 bits 
    printf ("%lu\n",sizeof(long long)); // prints 8 (bytes) = 64 bits 

ama derleyici yakınır:

warning: integer overflow in expression [-Woverflow] 

Neden taşması, ne ben eksik geliyor? bir taşma giden çok int aritmetik ifade gerçekleştirilir

cevap

19

sağ taraftaki rakamlar tip int değil, long long sahip oldukları için,.

Bunlardan birine LL eklerseniz, bunların tümünü tanıtacaktır.

+0

canım, haklısın. Biri her zaman f veya (döküm) yüzenleri eklediğini düşünür ... ama asla uzun sürmez :(Takdir et –

+0

@DervinThunk - sabitlerle unutmak kolay – teppic

+0

Daha kesin olarak, sabitler int türündedir ("tamsayı" dır daha genel bir terimdir, “char” dan “long long” ve muhtemelen daha fazlası) her şeyi kapsar. Eğer LL'yi en sağa 1024'e uygularsanız, hala bir taşma elde edebilirsiniz, 5 * 1024 * 1024 * 1024LL', '' 5 * 1024 * 1024', 'int' olarak değerlendirilmektedir - yasal olarak 16 bit kadar dar olabilir. En güçlü çözüm muhtemelen' 5LL * 1024LL * 1024LL * 1024LL' yazmaktır. - veya '5LL * (1LL << 30) '. –

İlgili konular