Hallo Liebe Community
Ich habe folgendes Problem, für meine Ausbildung muss ich nächste Woche eine Prüfung schreiben.
Unteranderem gibt es eine Aufgabe die mich total verwirrt.
--> Bestimmen Sie den jeweiligen Wert der Konvertierung.
Aufgabe:
sbyte var1 =-1;
ushort var2 = (ushort) var1;
Lösung: 65535 (1111'1111'1111'1111)
Im Grundsatz versehen ich wie gerechnet werden muss. Habe auch ein kleines Programm dazu geschrieben, das mir den Wert ausgibt um selbst schlau draus zu werden, vergeblich... ( Wir Programmieren Windows-FormApps)Was mir nun nicht klar ist das sbyte folgenden Wert ergibt:
private void button1_Click(object sender, EventArgs e)
{
sbyte var1 = -1;
TxtOutput.Text += "" + Convert.ToString(var1,2) + "\r\n"; // Binär: 1111'1111'1111'1111
TxtOutput.Text += Convert.ToString(var1); // Dezimal: -1
}
Ich habe gelernt das sbyte nur 8 bits gross ist, kann ja nur von -128 bis 127. Aber wieso bekommen ich dann eine 16stellige Binärzahl?
Besten dank!
blacktothemoon
Es gibt kein Convert.ToString(sbyte, int).
Daher wird (vermutlich) ein Cast (Boxing) auf Convert.ToString(UInt16, int) stattfinden und Du bekommst ein 16 Bit Output.
Evtl. könnte es auch (zusätzlich) daran liegen, dass negative Zahlen bei ToString via Two's complement dargestellt werden.
Siehe dazu den Dokumentationshinweis in Convert.ToString(Int32, Int32)
If value is negative and toBase is 2, 8, or 16, the returned string uses two's complement representation.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Danke für die Antwort.
Aber das würde heissen die Aufgabe ink. Lösung wäre ja dann flasch.
Aufgabe:
sbyte var1 = -1;
ushort var2 = (ushort) var1;
Lösung: 65535 (1111'1111'1111'1111)
Weil ich Aufgabenstellung ja nur Explizit konvertiert oder irre ich mich?
Ich hab mich auf Dein Code bezogen, und hier ist kein ushort zu sehen.
Und der Output Deines Codes bezieht sich eben auf den Programmierfehler, dass Du die Methodenparameter nicht beachtet hast.
Wenn es Dir um ushort und die "Aufgabenstellung" allein geht:
ushort
kann keine negativen Zahlen darstellen. Der Bereich geht von 0 bis 65535.
Da jedoch der Wert -1 für ushort
ungültig ist, wird einfach gesagt beim Cast knallhart der höchste mögliche Wert von ushort
verwendet (oder anderen Datentypen wie int auf uint etc..) - völlig egal ob die Quelle 8 oder 16 Bit hat.
PS: worauf sich "Lösung" bezieht konnte man aus Deinem Betrag nur erraten 😉
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
Hi blacktothemoon,
(ist jetzt ein bisschen her und ich hab da jetzt nicht gegoogeld) aber wenn du nur short (-32.766 bis 32.767 sollte grob stimmen) hast du das 1. Bit (ganz links) für das Vorzeichen (0=+ / 1= ).
Bei ushort hast du nur positive Zahlen. Das 1. Bit wird hier für die Zahl verwendet. Das erste Bit stellt also Zahlen > 32.767 das.
Da bin ich mir jetzt nicht sicher aber 1111.1111.1111.1111 ist glaube ich bei short -1 und wird bei ushort als 65535 dargestellt. -2 sollte dann 1111.1111.1111.1110 sein und 65534.
Am besten selber noch mal nachlesen. Ich hoffe ich konnte grob wieder geben worum es geht.
Sollte man mal gelesen haben:
Bei den meisten (heutigen) Computersystemen wird intern das Zweierkomplement ("Two's complement") verwendet.
Und bei einer sog. Promotion (d.h. eine Umwandlung von einem kleineren Datentyp in einen größeren Datentyp) von einem vorzeichenbehafteten (signed) Datentyp in einen vorzeichenlosen (unsigned) Datentyp, also z.B. von sbyte
nach ushort
, wird das Vorzeichenbit beibehalten (und entsprechend damit alle größeren Bits aufgefüllt).
Also in deinem Beispiel (8s -> 16u): aus 0xxxxxxx
wird 000000000xxxxxxx
und aus 1xxxxxxx
wird 111111111xxxxxxx
PS: Der englische Artikel zu Type conversion - Type promotion erklärt die Promotion etwas genauer als der deutsche.
... und jemand sollte dem Lehrer/Prof mal sagen dass er Beispiele aus der realen Welt nehmen soll und nicht solch verantwortungsloses Wertgeschubse.
Vielen Dank Leute!
Ich weiss meine Antwort kommt ein bisschen spät aber musste lernen. 8o
@witte: Ja die Prüfung ist ein Witz. Viele Übungen im Semester gehabt, natürlich alle gemacht, macht ja Spass 😁 aber dann kommt nur solche Theorie.
Vielen Dank noch mal an alle!