quot;Overflowquot; compiler error with -9223372036854775808L(编译器错误-9223372036854775808L(Q;溢出Q))
问题描述
Long data type的范围是-9223372036854775808
到9223372036854775807
,但以下语句生成编译器错误"BC30036:Overflow":
Dim a As Long = -9223372036854775808L
Try it online!
为什么这是一个错误?如何在代码中指定常量-9223372036854775808
?
推荐答案
为什么这是一个错误?
编译器将表达式-9223372036854775808L
解析为应用于十进制整数文字9223372036854775808L
的一元减号运算符。根据VB.NET specification:
十进制整数文字是由十进制数字(0-9)组成的字符串。
和:
如果整型文字的类型大小不足以容纳整型文字,则会导致编译时错误。
9223372036854775808L
对于Long
太大,因此会出现溢出错误。
(减号不是整型文字的一部分。)
如何在代码中指定常量-9223372036854775808?
要按字面意思指定-9223372036854775808
,请使用十六进制文字:
Dim a As Long = &H8000000000000000
VB.NET规范也暗示了这一点:
十进制文字直接表示整型文字的十进制值,而八进制和十六进制文字表示整型文字的二进制值(因此,&;H8000S为-32768,不是溢出错误)。
当然,为了清楚起见,您可能应该使用Long.MinValue
而不是文字:
Dim a As Long = Long.MinValue
C#怎么办?
正如勒内·沃格特指出的,等价的语句在C#中编译得很好:
long a = -9223372036854775808L;
这是因为(不像VB.NET)C# supports this as a special case:
如果DECIMAL_INTEGER_INTEGER_TEXAL的值为9223372036854775808(2^63),并且INTEGER_TYPE_SUFFIX或INTEGER_TYPE_SUFFIX
L
或l
作为紧跟在一元减号运算符内标识后面的标记出现,则结果是long
类型的常量,其值为-9223372036854775808(-2^63)。在所有其他情况下,此类DECIMAL_INTEGER_TEXAL的类型为ulong
。
这篇关于编译器错误-9223372036854775808L(&Q;溢出&Q)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:编译器错误-9223372036854775808L(&Q;溢出&Q)
基础教程推荐
- 如何使用OpenXML SDK将Excel转换为CSV? 2022-01-01
- C# - 如何列出发布到 ASPX 页面的变量名称和值 2022-01-01
- 使用 SED 在 XML 标签之间提取值 2022-01-01
- C# - 将浮点数转换为整数...并根据余数更改整数 2022-01-01
- Page.OnAppearing 中的 Xamarin.Forms Page.DisplayAlert 2022-01-01
- 创建属性设置器委托 2022-01-01
- 覆盖 Json.Net 中的默认原始类型处理 2022-01-01
- 我什么时候应该使用 GC.SuppressFinalize()? 2022-01-01
- 从 VB6 迁移到 .NET/.NET Core 的最佳策略或工具 2022-01-01
- 当键值未知时反序列化 JSON 2022-01-01