在C中使最小整数值为正

时间:2016-09-14 01:39:18

标签: c min

所以我有以下代码

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不起作用,并且数字仍为负数。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

不幸的是,为任何标准tipe分配的内存都是有限的,因此所有类型的范围都有相当明确的边界。违规的边界会导致计算错误。

要了解整数类型(不仅是int,还有charshort等)的边框(例如最小和最大可能值),您可以使用{{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;在我的第一个音符中)

4)detect integer overflow

有一些技巧

答案 1 :(得分:1)

适用于atoi()atol();如果转换后的值超出了返回类型的范围(分别为intlong int),则会出现未定义的行为(例如“格式化硬盘”)。

为避免未定义的行为,您必须使用atoi()atol()确保字符串中的值在之前之内。

正确确保字符串中的值在一定范围内(不使用atoi()atol())的任何技术也是一种可以稍微修改并用于检测和处理INT_MIN案例(不使用atoi()atol())。

答案 2 :(得分:0)

您正在遇到有符号长整数的值限制。您需要尝试使用其他数据类型。