C OVERFLOW!数字变负

问题描述:

我想乘以2整数,我总是得到一个负数,有人可以帮助我吗? (具有这种功能,我想从这个字符串,使“3924456639”一个整数)C OVERFLOW!数字变负

这里是我的代码:

long temp = 0; 

fgets(buf, sizeof buf, stdin); 

for(int i = 0; i < sizeof buf ;i++){ 
    if(buf[i] != ' ' && buf[i] != '\n'){ 
    temp *= 10;// <- gets negative 
    temp = temp + buf[i] - '0'; 

    }} 
+4

更改为无符号长整型。 – stark

您需要检查什么的sizeof(长)您的系统上,它可能是4

32位长变量将举行最大值为2147483647,如果你存储在它更大的价值将在负的范围内去,所以你需要声明temp unsigned long类型

+0

谢谢你的回答,我用这段代码试了一下: int m = 3924456639; unsigned long m1 =(long)3924456639; 012fprintf(“%d \ n”,sizeof m1); printf(“%d \ n”,m1); printf(“%d \ n”,m); 和我有这个输出: -370510657 -370510657 – bimbam

+0

妈呀,我真是太傻了,谢谢你风向标!!!!! – bimbam

+0

@bimbam改为'unsigned m = 3924456639u; unsigned long m1 = 3924456639u; printf(“%zu \ n”,sizeof m1); printf(“%lu \ n”,m1); printf(“%u \ n”,m);' –

您可以使用strtol 。没有必要重新发明轮子。

long int strtol(const char *str, char **endptr, int base) 
+0

它与strtol一起工作(所以我得到long int 3924456639)但为什么我不能像这样做:long var = 3924456639; ? – bimbam

+0

你是什么意思我只是做了很长时间var = 3924456639;它的工作原理@bimbam – KALALEX

+0

你使用哪种编译器? – KALALEX

你的主要问题是,通过所有的缓冲buf的你的循环步骤,而不是仅仅通过其包含的'\0'终止字符串步进。

例如,如果我们假设buf被宣布为char buf[100];我们输入的字符串"3924456639"然后buf将包含:

{'3','9','2','4','4','5','6','6','3','9','\n','\0', ... and 88 bytes of garbage} 

那么你的循环将通过正确的数字步骤,而忽略'\n'但它并没有停止。由于'\0'既不是' '也不是'\n'temp得到乘以十和'\0' - '0'被添加。对于88字节的垃圾既不是' '也不是'\n'

为了解决这个问题,更改:

for(int i = 0; i < sizeof buf ;i++){ 

到:

for(int i = 0; i < strlen(buf) ;i++){ 

或:

for(int i = 0; buf[i] != '\0' ;i++){ 

(如果你想使用strlen()记住#include <string.h>。)

注意:

  • 你的小问题是,long可能太小,你的号码。
  • 像@KALALEX指出的那样,您可以使用strtol()