checked/unchecked aus C#
-
Hi, kann mir mal jemand erklären was das unchecked hier bewirkt bzw. welcher Wert dann tatsächlich in WriteThrough steht:
public enum FileOptions { None = 0, WriteThrough = unchecked((int)0x80000000), Asynchronous = unchecked((int)0x40000000)
Und wie könnte man eine solche checked/unchecked Funktion in C++ abbilden?
-
Warum willst du es in C++ nachbilden, wenn du gar nicht weißt, wozu es gut ist?
-
Eigentlich will ich nur wissen welcher Wert in WriteThrough stehen würde, denn 0x80000000 kann nicht in einem int gespeichert werden.
-
Initializer schrieb:
0x80000000 kann nicht in einem int gespeichert werden.
Erstens ist das pauschal falsch, zweitens sind in C++ Konvertierungen aller arithmetischen Typen ineinander implizit möglich. Was
(int)0x80000000
für einen Wert hat, ist hier beschrieben:[conv.integral]/3 schrieb:
If the destination type is signed, the value is unchanged if it can be represented in the destination type; otherwise, the value is implementation-defined.
Gängige Implementierungen wie GCC oder Clang werden einfach eine bitweise Kopie machen, in der signifikantere Bits, falls nötig, abgeschnippelt werden. Für dein Beispiel ergibt das
0x80000000
modulo0x100000000
.~Edit: Die vielen Nullen haben mich erwischt ;-)~
-
Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum C# und .NET verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Initializer schrieb:
Und wie könnte man eine solche checked/unchecked Funktion in C++ abbilden?
Soweit ich das verstehe sorgt unchecked einfach dafür, dass der Compiler die Klappe hält. Das kann man in C++ auch durch einen expliziten Cast erreichen.
-
Ah, ok jetzt verstehe ich glaube ich. Da der Wert (anhand der Anzahl der Stellen von z. B. 0x80000000) theoretisch ausserhalb des Wertebereichs eines signed ints liegen könnte (was er aber nicht tut) gibt der gcc vorsichtshalber eine Fehlermeldung aus und erwartet einen expliziten cast um sich dieses Verhalten als erwünscht bestätigen zu lassen:
enum class FileOptions : int { Asynchronous = static_cast<int>(0x40000000), WriteThrough = static_cast<int>(0x80000000)
Aufgrund der Fehlermeldung hatte ich angenommen der gcc interpretiert den Wert warum auch immer als ausserhalb des Wertebereichs liegend was ja aber nicht sein dürfte.
-
Nein
0x80000000
ist defintiv zu groß für einenint
(Annahmesizeof(int) == 4
). Da hat der Compiler schon recht. Wenn du den Cast einbaust und es doch zu einemint
machst, kriegst du wahrscheinlich die kleinste Zahl dieint
darstellen kann, ist aber Implementation Defined wie Arcoth schon geschrieben hat. Warum nutzt du nichtunsigned int
(oder noch besseruint32_t
) für dein typed Enum?
-
Nein, wer schreibt denn heutzutage noch 32 bit software ;). Allerdings hast du wohl recht. Hatte in Eclipse noch nicht das -arch x86_64 flag gesetzt...
-
Das würde mich aber wundern wenn dadurch int bei dir 64 Bit groß ist:
https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models