2011-08-09 26 views
1

http://ideone.com/hANuZ如何在使用C或C++時防止整數溢出?

#include <stdio.h> 
int main(int argc, char *argv[]) { 
    /** 
    * Prints out powers of 2 for 32 iterations. 
    */ 
    int iterations = 0; 
    int value = 1; 
    while (iterations <= 32) { 
     // Prints in this format: iterations 2^n value 
     printf("%d\t2^%d\t%d", iterations, iterations, value); 
     switch (iterations) { 
      case 8: 
      case 16: 
      case 32: 
       printf("\t\t%d bit\n", iterations); 
       break; 
      default: 
       printf("\n"); 
       break; 
     } 
     value *= 2; 
     ++iterations; 
    } 
    return 0; 
} 

當我編譯和運行這個代碼段,當我打印「值」之後它大於2^30,甚至當我聲明它作爲一個無符號長怪異的東西發生。

我該怎麼辦?我只是一個初學者。 :-(

+3

實際上,這種運行33次迭代 –

+0

也許是因爲我使用++迭代? – Sweetgirl17

+0

hmm .... 0-32 = 33。初始化爲0並循環,直到它<= 32,因此它在循環中傳遞33次 –

回答

4

要打印它喜歡它是一個符號整數。請嘗試使用格式字符串

"%u\t2^%u\t%u" 

檢查您的printf文檔的所有格式的代碼和他們做什麼%uunsigned intunsigned long通常%lu

+0

這擺脫了第31次迭代中2^31上的 - 符號 – Sweetgirl17

+0

只有最後一個可能是'%u',前兩個是變量'迭代',可能是'%d'好吧 –

+0

@ Sweetgirl17,第32次迭代。你的第一次迭代是** 0 **,所以當「迭代」是31時,你就在你的第32次迭代。 –

1

是簡單的答案是嘗試宣告它作爲一個unsigned long long(根據標準,THX @caf最小64個比特),它是大於32個比特。

在處理特定尺寸很重要的類型時,應該使用已知尺寸的類型,例如int64_t

+0

'unsigned long long' *絕對*大於32位:要求至少爲64位。 – caf

+0

@caf:我認爲它只是比'long'更大。助教。 – sje397

+0

它只需要等於或大於'long',並且至少有64位。 「long」和「long long」都是64位,並且實際上在64位POSIX系統中很常見。 – caf

1

只是爲了好玩,我沒有修改的代碼示例一點點爲清楚起見

#include <stdio.h> 

int bitcount(unsigned long i) { 
    int count = 0; 
    while (i > 0) { 
     count++; 
     i>>=1; 
    } 
    return count; 
} 

int main(int argc, char *argv[]) { 
    /** 
    * Prints out powers of 2 for 32 iterations. 
    */ 
    int iterations = 0; 
    int value = 1; 
    while (iterations <= 32) { 
     // Prints in this format: iterations 2^n value 
     printf("%d\t2^%u\t%u\t\t%d bit\n", iterations+1, iterations, value, bitcount(value)); 
     value *= 2; 
     ++iterations; 
    } 
    return 0; 
} 

你會發現,1278 bit2569 bit。這是因爲

127 = 1000 0000 
256 = 1 0000 0000 

此外,2^320因爲

2^32 = 1 0000 0000 ... 0000 0000  (overflow for int) 
    = 0000 0000 ... 0000 0000 = 0 (only the first 32 bits are preserved)