2017-07-02 69 views
0

upd。所以我剛剛意識到這實際上是非常愚蠢的想法,因爲,據我所知,沒有辦法將負面的「飛越」數字轉換爲字符串,除非以某種方式禁止編譯器在數字前顯示「 - 」。通過使用字符串避免32位溢出

這是我的第一條消息,請原諒我是否有什麼問題。 因此,從第1周的演講中得到了這個基本代碼。

int main(void) 
{ 
    int n = 1; 
    for (int i = 0; i < 64; i++) 
    { 
     printf("n is %i\n", n); 
     n = n * 2; 
    } 
} 

我一直在想分配字符串n爲了通過-20億。

int main(void) 
{ 
    int n = 1; 
    for (int i = 0; i < 64; i++) 
    { 
     printf("n is %i\n", n); 
     n = n * 2; 
     if (n < 0){ 
      string n = get_string(); 
      printf("n is %s\n", n); 
     } 
    } 
} 

它給出了一個錯誤:declaration shadows a local variable。有沒有辦法來解決這個問題?謝謝。

+0

我認爲這不是一個編譯錯誤(它警告或彙編。選項會導致警告成爲錯誤。),但是您可以使用不重複的其他名稱。 – BLUEPIXY

+0

另外我不認爲讓用戶輸入一個字符串將避免溢出。 – BLUEPIXY

+0

'string n = get_string();'字符串在這裏沒有定義。 – wildplasser

回答

1

,你可以做以下不顯示此警告:

  • 請勿聲明變量,即無論與任何其他名稱重命名int nstring n使用n兩次。
  • 請勿使用編譯器的開關-Wshadow
0

您可以通過使用更大的類型,避免32位溢出:unsigned long long保證具有至少64值位:

#include <stdio.h> 

int main(void) { 
    unsigned long long n = 1; 
    for (int i = 0; i < 64; i++) { 
     printf("n is %llu\n", n); 
     n = n * 2; 
    } 
    return 0; 
} 
+0

是的,我知道。這個想法不是爲了避免32位溢出,而是讓它看起來如此。我只是想好好理解邏輯。 – Elagoff

+0

@Elagoff:您可以使用無符號類型來避免溢出到負值。有符號整數溢出實際上是未定義的行爲,而無符號數學運算是以'UINT_MAX + 1'爲模來執行的。 – chqrlie