我希望能够检查一个操作后的数字(最初是整数)是否会再次适合整数,如果没有,可以跳转到异常,或者有一些函数可以执行,例如 if isInteger()然后......
我不想转换为String,然后转换为Integer并检查长度。
为什么需要它?有一个变量(整数)保持更新间隔,每次服务器请求失败时都会加倍(无网络,无论如何)。所以我想在间隔达到最大可能的整数值时关闭自动更新,这是2,147,483,647
我寻找可能的答案,似乎所有人都使用String数据类型来检查数字的某些条件,但我不想使用中间数据类型
答案 0 :(得分:4)
我将在这里尝试描述解决您特定问题的各种方法,以及一些这种性质的更普遍的问题。
处理溢出的最常用方法是让编译器为您编写代码。启用overflow checking选项,如果执行结果不适合数据类型范围的操作,将引发异常。
$ 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
(保存中间计算的变量)为Int64
或Float
(或任何可存储此类大整数的类型)时才有效。
请注意,如果number
为Integer
,则它永远不会超过MaxInt
,因此上述比较无用,因为它将是编译器的快捷方式。在这种情况下,您可以执行(如David和LU建议的)比较之前将实际值存储在number
中。
if (number <= (MaxInt div 2)) then