2012-04-06 15 views
6

Ben C Bu kodu var başarısız (sadece çalışma için var):C sola kaydırma

char x; 
    uint64_t total = 0; 

    for(x = 20; x < 30; x++){ 
     total = (((((1 << x) * x)/64) + 1) * sizeof(uint64_t)); 
     printf("%d - %llu\n", x, total);   
    }  

yazdırılır Ne:

20 - 2621448 
21 - 5505032 
22 - 11534344 
23 - 24117256 
24 - 50331656 
25 - 104857608 
26 - 218103816 
27 - 18446744073625665544 
28 - 18446744073575333896 
29 - 18446744073508225032 

Neden x> 26 sahibim olanlar garip değerler? Ubuntu 10.10 64 bit üzerinde gcc 4.6.1'deyim.

+0

problemi char x gibi görünüyor, bunun için uint64_t kullanıyorum ve iyi çalışıyor. –

+0

Eğer toplam = (((((1 << x) * x)/64) + 1) * sizeof (uint64_t)); 'basitleştirilmişse, daha net olanı görebileceksiniz. (1 << x) * x); 'printf ile yazdırılır ("% d - 0x% llx \ n ", x, total);" printf tarafından büyük bir sayı ("... -% llu \ n", ... toplam); – gbulmer

cevap

18

1, int, 32 bit, yani (1 << 27)*27 taşmaları olduğundan. 1ull'u kullanın. x bir uint64_t ise Yorumlarınız İlişkin

, ardından 1 << x hala int olmakla çoğalması için o uint64_t dönüştürülürdü, hiçbir taşma olmazdı. Ancak, x >= 31, 1 << x, tanımlanmamış bir davranışsa (sonuçta işaretlenen 32 bit tam sayıyla gösterilemez).

+0

İşte bu adam! Teşekkürler! –

0

Ben kaymaması gibi 6 bitlik

char x; 
uint64_t one = 1; 
uint64_t total = 0; 

for(x = 20; x < 30; x++){ 
    total = ((((one << (x - 6)) * x) + 1) * sizeof(uint64_t)); 
    printf("%d - %llu\n", x, total);   
} 

henüz

derlenmiş değil

64 ile bölünme aynıdır 32bit ile hesaplamak ve 64 bit değerine daha sonra atamak, senin sorunun olduğunu tahmin