Laden...

sByte 16bit gross?

Erstellt von blacktothemoon vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.771 Views
B
blacktothemoon Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren
sByte 16bit gross?

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

16.834 Beiträge seit 2008
vor 5 Jahren

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.

B
blacktothemoon Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren

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?

16.834 Beiträge seit 2008
vor 5 Jahren

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 😉

P
1.090 Beiträge seit 2011
vor 5 Jahren

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:

Clean Code Developer
Entwurfsmuster
Anti-Pattern

4.939 Beiträge seit 2008
vor 5 Jahren

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.

W
955 Beiträge seit 2010
vor 5 Jahren

... und jemand sollte dem Lehrer/Prof mal sagen dass er Beispiele aus der realen Welt nehmen soll und nicht solch verantwortungsloses Wertgeschubse.

B
blacktothemoon Themenstarter:in
3 Beiträge seit 2018
vor 5 Jahren

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!