检查数字是否为整数类型

时间:2013-11-20 09:11:54

标签: delphi

我希望能够检查一个操作后的数字(最初是整数)是否会再次适合整数,如果没有,可以跳转到异常,或者有一些函数可以执行,例如 if isInteger()然后......

我不想转换为String,然后转换为Integer并检查长度。

为什么需要它?有一个变量(整数)保持更新间隔,每次服务器请求失败时都会加倍(无网络,无论如何)。所以我想在间隔达到最大可能的整数值时关闭自动更新,这是2,147,483,647

我寻找可能的答案,似乎所有人都使用String数据类型来检查数字的某些条件,但我不想使用中间数据类型

2 个答案:

答案 0 :(得分:4)

我将在这里尝试描述解决您特定问题的各种方法,以及一些这种性质的更普遍的问题。


处理溢出的最常用方法是让编译器为您编写代码。启用overflow checking选项,如果执行结果不适合数据类型范围的操作,将引发异常。

来自documentation

  

$ Q指令控制溢出检查代码的生成。在{$ Q +}状态下,检查某些整数算术运算(+, - ,*,Abs,Sqr,Succ,Pred,Inc和Dec)是否溢出。每个这些整数算术运算的代码后面都有附加代码,用于验证结果是否在支持的范围内。如果溢出检查失败,则引发EIntOverflow异常(或者如果未启用异常处理,程序将终止)。

因此,如果您希望捕获此类条件,则可以启用溢出检查并捕获EIntOverflow异常。


这将完全具有普遍性。但是,让我们考虑一个更具体的情况。假设您有一个正整数,您正在以正值递增。我们说您的计数器为count,您的增量为incr。您正试图检测何时

count + incr > MaxInt

重新安排这样的不平等:

count > MaxInt - incr

您可以在尝试增量操作之前简单地测试该不等式。


事实上,您的具体案例甚至比这更简单。您将值加倍而不是使用加法递增。所以只需检查是否

count <= MaxInt div 2

另一个选择是采用数量的基数2对数。这会将你的倍增过程转换为增量1.在这种情况下,你实际做的只是计数到31!并使用1 shl count执行转换回真实间隔。

答案 1 :(得分:2)

只需检查MaxInt

 if (number>MaxInt)

编辑(感谢大卫)

但是,这仅在number(保存中间计算的变量)为Int64Float(或任何可存储此类大整数的类型)时才有效。

请注意,如果numberInteger,则它永远不会超过MaxInt,因此上述比较无用,因为它将是编译器的快捷方式。在这种情况下,您可以执行(如David和LU建议的)比较之前将实际值存储在number中。

if (number <= (MaxInt div 2)) then