Compilerfehler "Overflow" mit -9223372036854775808L

8

Der Bereich des langen Datentyps ist -9223372036854775808 bis 9223372036854775807 , aber die folgende Anweisung generiert den Compilerfehler "BC30036: Overflow":

%Vor%

Probieren Sie es online aus!

Warum ist das ein Fehler? Wie kann ich die Konstante -9223372036854775808 im Code angeben?

    
Anurag Rao 05.03.2018, 15:25
quelle

1 Antwort

7

Warum ist das ein Fehler?

Der Compiler analysiert den Ausdruck -9223372036854775808L als einen unären Minus-Operator, der auf das Dezimal-Ganzzahl-Literal 9223372036854775808L angewendet wird. Gemäß der VB.NET-Spezifikation :

  

Ein dezimales Integer-Literal ist eine Folge von Dezimalziffern (0-9).

Und:

  

Wenn der Typ eines Integer-Literals nicht ausreicht, um das Integer-Literal aufzunehmen, tritt ein Fehler bei der Kompilierung auf.

9223372036854775808L ist zu groß für ein Long , Sie erhalten also einen Überlauffehler. (Das Minuszeichen ist nicht Teil des Integer-Literals.)

Wie kann ich die Konstante -9223372036854775808 im Code angeben?

Um -9223372036854775808 wörtlich anzugeben, verwenden Sie ein hexadezimales Literal:

%Vor%

Die VB.NET-Spezifikation spielt auch darauf an:

  

Dezimal-Literale stellen direkt den Dezimalwert des Integral-Literals dar, während Oktal- und Hexadezimal-Literale den Binärwert des Ganzzahl-Literals darstellen (daher ist & amp; H8000S -32768, kein Überlauffehler).

Aus Gründen der Übersichtlichkeit sollten Sie wahrscheinlich Long.MinValue anstelle eines Literals verwenden:

%Vor%

Was ist mit C #?

Wie René Vogt schon sagte, wird die äquivalente Aussage in C # gut übersetzt:

%Vor%

Das liegt daran, dass (im Gegensatz zu VB.NET) C # unterstützt dies als Sonderfall :

  

Wenn ein dezimal_integer_literal mit dem Wert 9223372036854775808 (2 ^ 63) und kein integer_type_suffix oder der integer_type_suffix L oder l angezeigt wird als das Token, das unmittelbar auf ein unäres Minus-Operator-Token folgt, ist das Ergebnis eine Konstante vom Typ long mit dem Wert -9223372036854775808 (-2 ^ 63). In allen anderen Situationen ist ein solches dezimal_integer_literal vom Typ ulong .

    
Michael Liu 05.03.2018 15:46
quelle

Tags und Links