是否有一种算法可以计算计算是否会溢出类型大小?
Is there an algorithm to compute if a calculation will overflow a type size?
是否有适用于大多数语言的算法来确定执行时的计算是否会溢出类型大小?
例如,如果在 Java 中给出以下代码片段(尽管我再次寻找任何语言的通用方法)
long variable = 2;
while(true){
variable = variable * Generalclass.function();
}
假设 Generalclass.function() 会 return 导致变量增加的东西最终会溢出,那么如果 Generalclass.function() 的属性未知(除了增加变量值之外的属性)。请注意,变量被声明为 long,因此简单地检查更大的数据类型将不起作用,因为不存在这样的数据类型。
对您的问题最直接的回答是“不,没有算法来计算计算是否会溢出”。每种类型的操作(加法、乘法等)对检测溢出条件都有独特的要求。在机器语言级别,某些处理器具有特殊条件代码,可以检查算术运算是否溢出,但在更高级别编码时,您无权访问此代码。
查看“Hacker's Delight”一书,了解一些检测溢出的算法。您可能还想查看各种 Java 数学“精确”方法的源代码。一些实现参考了 Hacker's Delight,其中许多也有“内部”版本,这些版本被更快的低级替代实现所取代。
是否有适用于大多数语言的算法来确定执行时的计算是否会溢出类型大小?
例如,如果在 Java 中给出以下代码片段(尽管我再次寻找任何语言的通用方法)
long variable = 2;
while(true){
variable = variable * Generalclass.function();
}
假设 Generalclass.function() 会 return 导致变量增加的东西最终会溢出,那么如果 Generalclass.function() 的属性未知(除了增加变量值之外的属性)。请注意,变量被声明为 long,因此简单地检查更大的数据类型将不起作用,因为不存在这样的数据类型。
对您的问题最直接的回答是“不,没有算法来计算计算是否会溢出”。每种类型的操作(加法、乘法等)对检测溢出条件都有独特的要求。在机器语言级别,某些处理器具有特殊条件代码,可以检查算术运算是否溢出,但在更高级别编码时,您无权访问此代码。
查看“Hacker's Delight”一书,了解一些检测溢出的算法。您可能还想查看各种 Java 数学“精确”方法的源代码。一些实现参考了 Hacker's Delight,其中许多也有“内部”版本,这些版本被更快的低级替代实现所取代。