2012-04-05 12 views
3

Die folgenden beiden Vorgänge sind identisch. MaxValues1 wird jedoch nicht kompiliert, da die Operation zur Überprüfungszeit im überprüften Modus überläuft. Kann jemand bitte erklären, was mit dem Compiler los ist und wie ich es umgehen kann, ohne einen fest codierten Wert wie in MaxValues2 verwenden zu müssen?Es wird versucht, eine große Zahl zur Kompilierzeit zuzuweisen.

public const ulong MaxValues1 = 0xFFFF * 0xFFFF * 0xFFFF; 

public const ulong MaxValues2 = 0xFFFD0002FFFF; 
+0

Bitte fügen Sie die entsprechende Sprache Tag ... –

Antwort

4

Um unsigned Literale zu erhalten, u Suffix hinzufügen und sie lange ein l Suffix zu machen. Sie benötigen ul.

Wenn Sie wirklich das Überlaufverhalten wollen, können Sie unchecked hinzufügen, um unchecked(0xFFFF * 0xFFFF * 0xFFFF) zu bekommen, aber das ist wahrscheinlich nicht das, was Sie wollen. Sie erhalten den Überlauf, weil die Literale als Int32 interpretiert werden und nicht als ulong, und 10 passt nicht zu einer 32-Bit-Ganzzahl, da es etwa 2^48 ist.

public const ulong MaxValues1 = 0xFFFFul * 0xFFFFul * 0xFFFFul; 
+0

‚und somit passt nicht lange.‘ Möchtest du diese Aussage ändern? –

+0

@KendallFrey Ich habe diesen Teil bereits neu formuliert, und war mir nicht sicher, ob ich schrieb passt nicht lange oder passt nicht zu einem int. lang ist natürlich falsch. – CodesInChaos

1

Ich denke, es ist eigentlich kein ulong, bis es am Ende zuweisen, versuchen

public const ulong MaxValues1 = (ulong)0xFFFF * (ulong)0xFFFF * (ulong)0xFFFF; 

dh in MaxValues1 Sie multiplizieren 3 32bit Ints zusammen, die überläuft als das Ergebnis als eine andere 32-Bit impliziert int, wenn man die Änderungen op zusammengegossen zu multiplizieren 3 ulongs welche gewohnt Überlauf, wie Sie sind das Ergebnis ein folgern

(ulong)0xFFFF * 0xFFFF * 0xFFFF; 

0xFFFF * (ulong)0xFFFF * 0xFFFF; 
ist

arbeiten auch als der Ergebnistyp auf der Grundlage der größten Typ berechnet

aber

0xFFFF * 0xFFFF * (ulong)0xFFFF; 

wird nicht als die ersten 2 arbeiten die int

+0

Das hat es funktioniert. Die 0xFFFFs sind tatsächlich fest codierte Konstanten in einem anderen Paket, dessen Quelle ich nicht ändern kann. Das Hinzufügen der Ulongs scheint das Problem behoben zu haben. Vielen Dank. –

+0

@George, wenn dies Ihr Problem gelöst hat, sollten Sie auf das Häkchen auf der linken Seite der Antwort klicken. –

2

standardmäßig Ganzzahlliterale Überlauf sind von Geben Sie int ein. Sie können das Suffix 'UL' hinzufügen, um sie in ulong Literale zu ändern.

public const ulong MaxValues1 = 0xFFFFUL * 0xFFFFUL * 0xFFFFUL; 

public const ulong MaxValues2 = 0xFFFD0002FFFFUL;