2017-07-02 34 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