所以我有以下代码
printf("atoi(input) = %d\n", atoi(input));
long number = 0;
if(atol(input) < 0){
printf("went into here\n");
printf("atoi = %d\n", atoi(input));
number = -1 * atoi(input);
printf("number = %d\n", number);
}else{
number = atoi(input);
}
但由于某些原因,当我的用户输入-2147483648(可能还有其他非常大的小数)时,乘以-1不起作用,并且数字仍为负数。有什么想法吗?
答案 0 :(得分:1)
不幸的是,为任何标准tipe分配的内存都是有限的,因此所有类型的范围都有相当明确的边界。违规的边界会导致计算错误。
要了解整数类型(不仅是int
,还有char
,short
等)的边框(例如最小和最大可能值),您可以使用{{1} }。 E.g:
limits.h
注意:
1)限制值取决于编译器和平台(例如,对于我的系统#include <stdio.h>
#include <limits.h>
int main(void)
{
printf("INT_MIN = %d\n", INT_MIN);
printf("INT_MAX = %d\n", INT_MAX);
printf("LONG_MIN = %ld\n", LONG_MIN);
printf("LONG_MAX = %ld\n", LONG_MAX);
printf("LLONG_MIN = %lld\n", LLONG_MIN);
printf("LLONG_MAX = %lld\n", LLONG_MAX);
return 0;
}
等于LONG_MIN
,但是,您可能会看到不同的值);
2)INT_MIN
只是可以选择和探索的文本文件
3)还了解limits.h
,提供固定大小的类型(并且允许程序在没有&#34的情况下可移植;也许&#34;在我的第一个音符中)
答案 1 :(得分:1)
适用于atoi()
和atol()
;如果转换后的值超出了返回类型的范围(分别为int
和long int
),则会出现未定义的行为(例如“格式化硬盘”)。
为避免未定义的行为,您必须使用atoi()
或atol()
确保字符串中的值在之前之内。
正确确保字符串中的值在一定范围内(不使用atoi()
或atol()
)的任何技术也是一种可以稍微修改并用于检测和处理INT_MIN
案例(不使用atoi()
或atol()
)。
答案 2 :(得分:0)
您正在遇到有符号长整数的值限制。您需要尝试使用其他数据类型。