【问题标题】:Making the minimum integer value positive in C在C中使最小整数值为正
【发布时间】:2017-01-21 17:16:01
【问题描述】:

所以我有以下代码

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

【问题讨论】:

  • 因为 32 位有符号整数值不能是 +2147483648。 -2147483648 的二进制补码是 -2147483648。
  • 天哪,我真笨。这个赋值甚至应该让我们熟悉 32 位的无符号/有符号/二进制限制
  • 如果您在long 是 64 位类型(除 Windows 之外的大多数地方)时在系统上编译 64 位,则将其设置为 -1L * atoi(input) 将通过强制升级来解决该极端情况long.
  • 不幸的是,我正在为一个班级和我的 32 位 RaspPi 做这个,所以就是这样
  • @JosephPerez 没有什么能阻止 Pi 进行 64 位数学运算

标签: c min


【解决方案1】:

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

要了解整数类型(不仅是int,还包括charshort 等)的边界(例如可能的最小值和最大值),您可以使用limits.h。例如:

#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;
}

注意:

1) 限制值取决于编译器和平台(例如,对于我的系统,LONG_MIN 等于 INT_MIN,但也许,您会看到不同的值);

2) limits.h 只是一个可以打开和探索的文本文件

3) 还了解stdint.h,它提供了具有固定大小的类型(并允许程序在我的第一个注释中没有“可能”的情况下可移植)

4)有一些技巧可以detect integer overflow

【讨论】:

  • 这对我了解很有帮助
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 其实问题出在int
    猜你喜欢
    • 1970-01-01
    • 2020-06-20
    • 2022-08-10
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 2015-10-15
    • 2022-01-20
    • 2021-04-01
    相关资源
    最近更新 更多