Typcasting zwischen ganzen Zahlen

mustinet1900

Mitglied
Hi Leute,


ich habe in 2 Wochen meine Java Klausur und wollte euch mal bei ner Kleinigkeit was fragen.

Es geht um das Thema Typcasting, also implizit und explizit.
Soweit komme ich da auch ganz gut zu recht, aber bei dem expliziten in dem man von einem grßen ganzzahligen Wert zu einen kleineren castet bin ich noch nicht so aufm Baum.

Bspl. int 257 in byte .

In der Lösung wird angegeben das 257 im Binärsystem 100000001 ist, also 9 Stellen.
byte hat 8 Bits.Deshalb wird aus der 257 -> 00000001.
Das erste Bit wird abgeschnitten.


So jetzt der Punkt der mich verwirrt.
Im Skript steht : Bei der Konvertierung eines größeren Ganzzahltyps in einen kleineren werden die oberen Bits abgeschnitten und als Bsp. steht dort noch :

int i = 385; byte a = (byte) i; ergibt a = -127

Fragen :
1. Warum wird oben bei der 257 die eins am Anfang abgeschnitten und nicht am Ende?
Im Skript steht doch das die oberen Bits abgeschnitten werden.

2. Das Bspl. Nr. 2 , also die 385 nach -127 als byte Wert.Kann mir jemand erklären wie man darauf kommt?

3. Kann oder muss man eigentlich diese Umwandlung in die Binärwerte aus dem Kopf können?
Wollte nämlich die 385 als Binärwert
darstellen so wie es mit der 257 gemacht wurde, aber die Binär Rechner die ich gegoogelt habe z.B.

NickCiske.com | Binary - it's digitalicious!

hier spuckt bei dem Wert 257 viel längere Zahlen raus als ich auf meinem Blatt habe ( 257 = 00110010 00110101 00110111 00001101 00001010 )

dankeschön

Grüße
 
3. Kann oder muss man eigentlich diese Umwandlung in die Binärwerte aus dem Kopf können?
Wollte nämlich die 385 als Binärwert
darstellen so wie es mit der 257 gemacht wurde, aber die Binär Rechner die ich gegoogelt habe z.B.

NickCiske.com | Binary - it's digitalicious!

hier spuckt bei dem Wert 257 viel längere Zahlen raus als ich auf meinem Blatt habe ( 257 = 00110010 00110101 00110111 00001101 00001010 )

Die Umwandlung solltest du schon können, aber ich sag mal gerade die in Binärwerte ist ja recht einfach. Und der Rechner den du da gefunden hast, der macht nicht das was du suchst.
Umrechnung von Zahlensystemen (da gibts auch ne ganz tolle Erklärung dazu!)
Sowas suchst du eher. Das was du da gefunden hast, gibt dir die Binärwerte für die Zeichen, wenn ich das richtig verstanden habe.
Aber selbst der Windowsrechner kann diese Umrechnung, einfach auf den "Programmer" (im englischen Windows zumindest) Modus umstellen.

Fragen :
1. Warum wird oben bei der 257 die eins am Anfang abgeschnitten und nicht am Ende?
Im Skript steht doch das die oberen Bits abgeschnitten werden.

Die oberen Bits sind ja die linken, das rechts ist das 1. Bit 😛
 
Zuletzt bearbeitet:
385 ist Binär 110000001
vordere Bit(s) abgeschnittet = 10000001
Da das vordere Bit gesetzt ist, ist es als eine negative Zahl markiert. Das ist bei 257 eben anders
100000001 = 00000001 = 1 (8.Bit nicht gesetzt)

Java ist auch eine Insel – 2.3 Datentypen
Bei der Konvertierung eines größeren Ganzzahltyps in einen kleineren werden einfach die oberen Bit abgeschnitten. Eine Anpassung des Vorzeichens findet nicht statt. Die Darstellung in Bit zeigt das sehr anschaulich:

int ii = 123456789; // 00000111010110111100110100010101
int ij = –123456; // 11111111111111100001110111000000
short si = (short) ii; // 1100110100010101
short sj = (short) ij; // 0001110111000000
System.out.println( si ); // –13035
System.out.println( sj ); // 7616
sj wird eine negative Zahl, da das 16. Bit beim int ii gesetzt war und nun beim short das negative Vorzeichen anzeigt. Die native Zahl ij hat kein 16. Bit gesetzt, und so wird das short sj positiv.
 
1. Warum wird oben bei der 257 die eins am Anfang abgeschnitten und nicht am Ende?
Im Skript steht doch das die oberen Bits abgeschnitten werden.

"Oben" ist "links" 😉


2. Das Bspl. Nr. 2 , also die 385 nach -127 als byte Wert.Kann mir jemand erklären wie man darauf kommt?

Dort steht doch sicher auch einges zu Zweierkomplement und Vorzeichenbits?!

3. Kann oder muss man eigentlich diese Umwandlung in die Binärwerte aus dem Kopf können?
Wollte nämlich die 385 als Binärwert
darstellen so wie es mit der 257 gemacht wurde, aber die Binär Rechner die ich gegoogelt habe z.B.

NickCiske.com | Binary - it's digitalicious!

hier spuckt bei dem Wert 257 viel längere Zahlen raus als ich auf meinem Blatt habe ( 257 = 00110010 00110101 00110111 00001101 00001010 )

Öhm... so aufwändig ist das nicht:
Code:
Nach jedem Schritt durch 2 Teilen und den Rest abschneiden:
385 ist ungerade: 1
192 ist   gerade: 0
 96 ist   gerade: 0
 48 ist   gerade: 0
 24 ist   gerade: 0
 12 ist   gerade: 0
  6 ist   gerade: 0
  3 ist ungerade: 1
  1 ist ungerade: 1

Was die verlinkte Seite macht ist... wohl den ASCII-Code der einzelnen Zeichen (!) binär darzustellen. Binär kann jeder vernünftige Taschenrechner - UND der Windows-Taschenrechner...
 
Umrechnung von Zahlensystemen (da gibts auch ne ganz tolle Erklärung dazu!)
Sowas suchst du eher. Das was du da gefunden hast, gibt dir die Binärwerte für die Zeichen, wenn ich das richtig verstanden habe.

Die oberen Bits sind ja die linken, das rechts ist das 1. Bit 😛

Die Seite hatte ich auch gefunden nur wurde da nicht so recht schlau.
Hatte im Bereich Zahlensystem 3 gewählt, weil 385 dreistellig ist und dann stand da rechts NaN, also not a number.

385 ist Binär 110000001
vordere Bit(s) abgeschnittet = 10000001
Da das vordere Bit gesetzt ist, ist es als eine negative Zahl markiert. Das ist bei 257 eben anders
100000001 = 00000001 = 1 (8.Bit nicht gesetzt)

Also immer wenn am Anfang statt ner null eine 1 steht ist es negativ.
Und wenn ich von gross auf klein caste wird bei ganzen Zahlen immer die erste Zahl abgeschnitten?

"Oben" ist "links" 😉




Dort steht doch sicher auch einges zu Zweierkomplement und Vorzeichenbits?!



Öhm... so aufwändig ist das nicht:
Code:
Nach jedem Schritt durch 2 Teilen und den Rest abschneiden:
385 ist ungerade: 1
192 ist   gerade: 0
 96 ist   gerade: 0
 48 ist   gerade: 0
 24 ist   gerade: 0
 12 ist   gerade: 0
  6 ist   gerade: 0
  3 ist ungerade: 1
  1 ist ungerade: 1


Mehr steht im Skript leider nicht dazu und über Binär steht eigentlich nix, also das Wort binär taucht auch gar nicht auf .Es gibt da nur das Bsp mit 385, also die Konvertierung von int nach byte.

Das einzige wo das Wort binär vor kommt ,war im Kommentar zur Übungsaufgabe mit der 257.

Ist der obige Ablauf bei jeder Zahl gleich?
Und wenn ich den binär Wert dann habe, wie komme auf die -127 als Byte ?

Hab mal ein Bsp wie oben gemacht :

250 gerade 0
125 ungerade 1
62 gerade 0
31 ungerade 1
15 ungerade 1
7 ungerade 1
3 ungerade 1
1 ungerade 1

Ist das ungefähr richtig?

Und wenn ich die Binär Zahl dann habe, wie gehts weiter?
Sagen wir mal ich will int 250 nach byte konvertieren.

Dann weiss ich jetzt die Binärzahl und wie mache ich den Rest?

Bisher schon ganz herzlichen Dank für die Anworten.
 
Zuletzt bearbeitet:
Da wäre noch das mit der 1 bei 257.

Also binär Zahl ist ja 1000000001.
Am Anfang ist ne 1 gesetzt, deshalb positiv und die 1 am Anfang wird auch abgeschnitte, weil 8 Bit.

So der Compiler gibt jetzt bei dieser int zu byte konvertierung ne 1 raus.
Ist diese 1 die da am Anfang abgeschnitten wurde?

Denn nach dieser Rechnung müsste der Compiler bei 385 ja auch bei byte die abgeschnitten 1 ausgeben, aber da wird -127 ausgegeben
 
Da wäre noch das mit der 1 bei 257.

Also binär Zahl ist ja 1000000001.
Am Anfang ist ne 1 gesetzt, deshalb positiv und die 1 am Anfang wird auch abgeschnitte, weil 8 Bit.
Nein, du musst anders vorgehen, erst abschneiden, dann gucken ob vorne eine 1 steht. Und vorne 1 steht für negativ, nicht positiv!
1000000001 -> abschneiden -> 00000001 --> 1

Und das mit 385 hatte ich doch auch schon gesagt:

385 ist Binär 110000001 -> abgeschnittet = 10000001
Da nun vorne eine 1 steht, ist diese Zahl negativ (die eins vorne kannst du dir jetzt wegdenken) , also denkst du dir jetzt wieder
0000001 = 1.
-128+1 = -127
Nehmen wir mal eine Zahl höher, die 386
110000010 -> abschneiden -> 10000010 (0000010 = 2)
-128+2 = -126
usw.

Hab mal ein Bsp wie oben gemacht :

250 gerade 0
125 ungerade 1
62 gerade 0
31 ungerade 1
15 ungerade 1
7 ungerade 1
3 ungerade 1
1 ungerade 1

Ist das ungefähr richtig?
Ja, korrekt. Man könnte es auch anders schreiben
Code:
250 : 2 = 125  Rest: 0
125 : 2 =  62  Rest: 1
usw..
 
Zuletzt bearbeitet:
Die Seite hatte ich auch gefunden nur wurde da nicht so recht schlau.
Hatte im Bereich Zahlensystem 3 gewählt, weil 385 dreistellig ist und dann stand da rechts NaN, also not a number.

Oh mein Gott, nein! Die Anzahl der Stellen hat doch nichts mit dem Zahlensystem zu tun. Wir rechnen grundlegend im Dezimalsystem (10er), ein Computer tut dies im Binärsystem (2er). Noch andere rechte bekannte sind das Oktal- (8er) und Hexadezimale (16er).
Deine Zahl du hier gegeben hast ist die 385, diese ist dezimal dargestellt.
Die Fehlermeldung die sich dort ergibt, wenn du das 3er Zahlensystem wählst ist logisch, denn das 3er Zahlensystem kennt nur 3 Zahlen. Die 0, 1 und 2. Also sind ihm die 3, 5 und 8 fremd.
Genauso kennt das binäre Zahlensystem, wie du es ja bereits kennengelernt hast, nur zwei Zahlen, die 0 und die 1.
Und in dem uns üblicherweise bekannten dezimalen System gibt es 10 Zahlen. 0, 1, 2, ..., 8, 9. Die 10 würde sich ja wieder bilden aus einer 1 und einer 0. Also quasi aus zwei Zahlen.
Gehen wir noch weiter: Im Hexdezimalen System gibt es 16 Zahlen. 0, 1, 2, ..., 8, 9, A, B, C, D, E, F. Wolltest du also die uns bekannte 15 Hexadezimal schreiben, würde ein einfaches F reichen, um das darzustellen.

Und so kannst du jede Zahl aus dem 10er System heraus in ein anderes rechnen, im dem du schrittweise immer so vorgehst.
385 ins 2er System ->
Code:
     385 : 2 = 192  Rest: 1
     192 : 2 =  96  Rest: 0
      96 : 2 =  48  Rest: 0
      48 : 2 =  24  Rest: 0
      24 : 2 =  12  Rest: 0
      12 : 2 =   6  Rest: 0
       6 : 2 =   3  Rest: 0
       3 : 2 =   1  Rest: 1
       1 : 2 =   0  Rest: 1

     Resultat: 110000001

385 ins 3er System ->
Code:
     385 : 3 = 128  Rest: 1
     128 : 3 =  42  Rest: 2
      42 : 3 =  14  Rest: 0
      14 : 3 =   4  Rest: 2
       4 : 3 =   1  Rest: 1
       1 : 3 =   0  Rest: 1

     Resultat: 112021

385 ins 16er System ->
Code:
     385 : 16 =  24  Rest:  1   --> Ziffer: 1
      24 : 16 =   1  Rest:  8   --> Ziffer: 8
       1 : 16 =   0  Rest:  1   --> Ziffer: 1

     Resultat: 181

Es handelt sich also immer um die gleiche Anzahl von Elementen, nur anders dargestellt!
 

Zurück
Oben