【发布时间】:2014-09-21 08:14:17
【问题描述】:
所以问题是:
给定一个在给定编译器(语言?)中表示最大可能数字的本机整数类型,例如 C# 中的 ulong,您如何检测到表示数字的输入字符串将溢出最大值可以由该给定类型表示,而无需回退到已检查的上下文和运行时OveflowException?
显然 C# 编译器可以检测常量整数溢出:
ulong l = 18446744073709551615; //ok
ulong l = 18446744073709551616; //compile time error: Integral constant is too large.
编译器是否在后台使用运行时OverflowException(或等效项)?如果是这样,有没有办法在不重复运行时异常或构建可以容纳更大数字的数字类型(如System.Numeric.BigInt)的情况下实际执行此操作?值得注意的是,BigInt 在 C# 中没有原生支持,因为以下是编译时错误,尽管整数常量在类型范围内:
BigInt i = 18446744073709551616; //compile time error: Integral constant is too large.
【问题讨论】:
-
像
TryParse这样的幕后异常是否也算作禁忌? -
你可以看看
UInt64.TryParse,路上没有try-catch。但是,我不知道编译器实际使用的方式。 -
@InBetween :“如果我没记错,TryParse 只是包装了 Parse,它确实会引发运行时异常”。不,这是一个无异常的实现。这就是重点。
-
您可以使用
unchecked上下文并进行类似硬件的溢出检测,但不确定这是否比异常更好。 -
@InBetween:出于某种原因,我上面指向
Uint64.TryParse的链接不正确,这是我最初想要链接的内容:referencesource.microsoft.com/#mscorlib/system/…
标签: c# integer-overflow