編譯器錯誤-9223372036854775808L(&Q;溢出&Q) [英] "Overflow" compiler error with -9223372036854775808L
問題描述
Long data type的范圍是-9223372036854775808
到9223372036854775807
,但以下語句生成編譯器錯誤"BC30036:Overflow":
Dim a As Long = -9223372036854775808L
為什么這是一個錯誤?如何在代碼中指定常量-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)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!