編譯器錯誤-9223372036854775808L(&Q;溢出&Q) [英] "Overflow" compiler error with -9223372036854775808L

查看:0
本文介紹了編譯器錯誤-9223372036854775808L(&Q;溢出&Q)的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

Long data type的范圍是-92233720368547758089223372036854775807,但以下語句生成編譯器錯誤"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_SUFFIXINTEGER_TYPE_SUFFIXLl作為緊跟在一元減號運算符內標識后面的標記出現,則結果是long類型的常量,其值為-9223372036854775808(-2^63)。在所有其他情況下,此類DECIMAL_INTEGER_TEXAL的類型為ulong。

這篇關于編譯器錯誤-9223372036854775808L(&Q;溢出&Q)的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,也希望大家多多支持IT屋!

查看全文
登錄 關閉
掃碼關注1秒登錄
發送“驗證碼”獲取 | 15天全站免登陸
全免费A级毛片免费看无码播放