【问题标题】:Detect Integer Overflow in Input检测输入中的整数溢出
【发布时间】:2012-10-07 22:21:18
【问题描述】:

在 C 或 C++ 中有没有办法检查用户提供的数字是否超出整数类型的范围?

例如,假设我们使用 16 位有符号整数,范围为 -32768 到 32767。

如果用户在程序中输入55555,它会被包装成一个负数,这样如果你使用一个可以接受任何数字的函数,结果就会出错。

在C或C++中有没有办法判断用户提供的数字是否在整数类型的范围内?


更新:我在一个简单的减法程序中使用这些数字,该程序接受两个数字并从第一个数字中减去第二个数字。

【问题讨论】:

  • 您使用什么编程语言? C++ 和 C 不一样,尤其是在读取输入方面。
  • @aam1r - 我不认为这实际上是重复的。该链接是关于在数学运算期间检测整数溢出,Matthew 的问题是关于从用户获取值时的整数溢出。
  • @Mike:对不起,我误读了这个问题。感谢您指出这一点!

标签: c++ c integer overflow


【解决方案1】:

如果您使用strtol 之类的东西,如果发生溢出,它会将errno 设置为ERANGE

【讨论】:

  • 正确,但我认为问题在于是否可以在从文本到整数的转换过程中检测到溢出。一旦你把它变成一个整数,你就可以进行自己的范围检查,以确保它在你要转换为的任何数据类型的范围内(即短)。
【解决方案2】:

如果用户在程序中输入55555,这将被包装成负数

并非总是如此。这取决于您如何阅读数字。例如,如果您使用 operator>>,该值将被包装,它将被拒绝。

在C或C++中有没有办法判断用户提供的数字是否在整数类型的范围内?

在 C++ 中,只需使用 operator>>:

#include <iostream>
int main() {
  signed short int i;
  std::cin >> i;
  if(std::cin)
    std::cout << "You entered a valid number!\n";
  else
    std::cout << "Aw c'mon, play by the rules.\n";
}

【讨论】:

    【解决方案3】:

    在 C 或 C++ 中有没有办法检查提供的数字是否 用户是否超出整数类型范围?

    这取决于您使用的功能(例如strtol 可以做到这一点)。检查文档。

    【讨论】:

    • strtol 用于longint 的函数是 strtoimax
    • @Barmar 那是intmax_t,通常比int大。
    【解决方案4】:

    int 和 uint 之间的唯一区别是如何解释它们。如果您考虑切换到浮点参数、检查值和类型转换,那么您的问题没有解决方案。更新:我以为你想要其他程序员提供的运行时检查函数参数值,而不是控制台输入。

    【讨论】:

    • 虽然在实践中大部分时间都是如此,尤其是在 CPU 中如此,但编译器和语言标准却有所不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-23
    • 1970-01-01
    相关资源
    最近更新 更多