Java Datentyp byte macht alle Werte größer als 127 negativ?
Hallo Leute,
laut meinem Verständnis kann ein 8 Bit (sprich 1 byte), System mit 2^7 Zahlen rechnen. 2^7 + 2^6 + 2^5 ... + 2^0 = 255. Das bedeutet ein Computer kann in einem byte Zahlen von 0 bis 255 darstellen.
Wenn ich in Java eine Variable mit dem Datentyp byte erstelle, dann werden jedoch alle werte, die ich für die Variable deklariere, die größer als 127, negativ dargestellt.
Mein Informatik Lehrer hatte darauf keine Antwort, der hatte aber auch nicht so bock sich damit auseinander zu setzten, also Frage ich hier. Ich hoffe die Frage ist verständlich.
4 Antworten
Hallo.
Das bedeutet ein Computer kann in einem byte Zahlen von 0 bis 255 darstellen.
Nein, das bedeutet dass man 256 unterschiedliche Zustände erzeugen kann. Also zum Beispiel die Zahlen 0 bis 255. Andererseits aber auch von -128 bis 127, wenn man den Strahl etwas verschiebt und die negative Seite mit abdecken möchte.
So ist ein Integer zwar als Ganzzahl definiert und in Java immer 32 bit groß, allerdings ist der Wertebereich von -2^31 bis 2^31 - 1 festgelegt. Das heißt die Zahl 2^31 (2.147.483.648) könntest du nicht mehr in einem Int speichern.
Tut er ja nicht. Der Wertebereich geht im positiven Teil "nur" bis 2^31 - 1
Das bedeutet bei 8 Bit geht der Wertebereich auch nur bis 2^7 - 1?
Abhängig davon, ob der Datentyp signed ist oder nicht. Zumal es auch abhängig von der Programmiersprache ist. Java setzt die 0 in den positiven Bereich, andere Programmiersprachen könnten das anders handhaben.
So gut wie jede Hochsprache dürfte sich der Zweierkomplement-Darstellung bedienen (die auch in den zugrundeliegenden Maschinensprachen für vorzeichenbehaftete Zahlen durchwegs üblich ist), und daraus ergibt sich dieser Wertebereich.
So gut wie jede Hochsprache
Du glaubst gar nicht, was man alles erlebt, wenn man sich mal mit den unterschiedlichsten Programmiersprachen befasst. 😉
Daher habe ich einen allgemeingültigen Ansatz gewählt:
andere Programmiersprachen könnten das anders handhaben
In Java ist der Datentyp byte "signed", also vorzeichenbehaftet. Somit werden die Werte nicht als 0..255 interpretiert, sondern als -128..127 im üblichen Zweierkomplement.
https://docs.oracle.com/javase/specs/jls/se21/html/jls-4.html#jls-4.2.1
Das ändert aber nichts an den gespeicherten Bits, sondern nur daran, wie sie von diversen Operationen interpretiert werden. Java hat an sich keine vorzeichenlosen ("unsigned") primitiven Typen. Für manche Anwendungsfälle gibt es jedoch spezifische Methoden, die sie als vorzeichenlos behandeln, z.B.
Ja. In der Praxis nutzt das aber wieder nur begrenzt, weil mit char nur eher mühsam Arithmetik möglich ist - jede arithmetische Operation hat als Resultat ein int oder long, also muss zurückgecastet werden. Der Typ ist eben tatsächlich für Zeichen (im Sinne von Codepoints) gedacht.
2^8 Zahlen können dargestellt werden... also 2^7+2^6+usw.
Ein byte ist in Java immer vorzeichenbehaftet, d. h., nach 127 beginnen die negativen Zahlen...
Btw.: Die 0 zählt zu den positiven Zahlen.
Ich denke mal das Java aus dem byte automatisch ein signed byte macht oder sie als solche definiert wurde. Würde zu mindest erklären wie das zu stande kommt. signed byte deckt nämlich die Zahlen von -128 bis 127 ab, unsigned von 0 bis 256. Definiere mal die Zahl konsequent als unsigned byte. Wenn beim signed byte eine Zahl größer als 127 wird führt das zum overflow, dann
Ja macht er tatsächlich, deshalb verlangt er auch die ganze Zeit von mir, dass ich die Zahlen in Verbindung mit der Byte Variable von int in einen byte casten soll, obwohl alle Variablen in der Klasse ein Byte sind. Wie erstelle ich denn einen unsigned byte in Java?
https://programming.guide/java/unsigned-byte.html Java hat per definition kein unisgned byte. Es gibt aber funktionen die das casten für dich übernehmen. Siehst du hier.
Ja natürlich, 256 zustände logisch. Warum kann denn ein Integer nicht den Zustand 2^31 speichern, wenn er im Wertebereich liegt?