Long data type的范围是-9223372036854775808
到9223372036854775807
,但是以下语句会生成编译器错误" BC30036:溢出":
Dim a As Long = -9223372036854775808L
为什么这是一个错误?如何在代码中指定常量-9223372036854775808
?
答案 0 :(得分:8)
编译器将表达式-9223372036854775808L
解析为应用于十进制整数文字9223372036854775808L
的一元减号运算符。根据{{3}}:
十进制整数文字是一个十进制数字字符串(0-9)。
和
如果整数文字的大小不足以容纳整数文字,则会产生编译时错误。
9223372036854775808L
对于Long
而言太大,因此您会收到溢出错误。
(减号不是整数文字的一部分。)
要按字面指定-9223372036854775808
,请使用十六进制文字:
Dim a As Long = &H8000000000000000
VB.NET规范也提到了这一点:
十进制文字直接表示积分文字的十进制值,而八进制和十六进制文字表示整数文字的二进制值(因此,& H8000S是-32768,而不是溢出错误)。
当然,为了清楚起见,您应该只使用Long.MinValue
而不是文字:
Dim a As Long = Long.MinValue
正如RenéVogt指出的那样,等效语句在C#中编译得很好:
long a = -9223372036854775808L;
那是因为(与VB.NET不同)VB.NET specification:
当 decimal_integer_literal 的值为9223372036854775808(2 ^ 63)且没有 integer_type_suffix 或 integer_type_suffix
L
或{{ 1}}作为紧跟在一元减号运算符标记之后的标记出现,结果是类型为l
的常量,其值为-9223372036854775808(-2 ^ 63)。在所有其他情况下,此类 decimal_integer_literal 的类型为long
。