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';
}}
您需要检查什么的sizeof(长)您的系统上,它可能是4
32位长变量将举行最大值为2147483647,如果你存储在它更大的价值将在负的范围内去,所以你需要声明temp
unsigned long类型
谢谢你的回答,我用这段代码试了一下: int m = 3924456639; unsigned long m1 =(long)3924456639; 012fprintf(“%d \ n”,sizeof m1); printf(“%d \ n”,m1); printf(“%d \ n”,m); 和我有这个输出: -370510657 -370510657 – bimbam
妈呀,我真是太傻了,谢谢你风向标!!!!! – bimbam
@bimbam改为'unsigned m = 3924456639u; unsigned long m1 = 3924456639u; printf(“%zu \ n”,sizeof m1); printf(“%lu \ n”,m1); printf(“%u \ n”,m);' –
你的主要问题是,通过所有的缓冲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()
。
更改为无符号长整型。 – stark