使用-9223372036854775808L“溢出”编译器错误

问题描述 投票:8回答:1

Long data type的范围是-92233720368547758089223372036854775807,但是以下语句生成编译器错误“BC30036:溢出”:

Dim a As Long = -9223372036854775808L

Try it online!

为什么这是一个错误?如何在代码中指定常量-9223372036854775808

.net vb.net long-integer
1个回答
8
投票

为什么这是一个错误?

编译器将表达式-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#怎么样?

正如RenéVogt指出的那样,等效语句在C#中编译得很好:

long a = -9223372036854775808L;

这是因为(与VB.NET不同)C# supports this as a special case

当值为9223372036854775808(2 ^ 63)且没有integer_type_suffix或integer_type_suffix Ll的decimal_integer_literal作为紧跟在一元减号运算符标记之后的标记出现时,结果为long类型的常量,其值为-9223372036854775808(-2 ^ 63)。在所有其他情况下,这样的decimal_integer_literal是ulong类型。

© www.soinside.com 2019 - 2024. All rights reserved.