Java Datentyp byte macht alle Werte größer als 127 negativ?

4 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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.

Woher ich das weiß:Studium / Ausbildung – Diplom Wirtschaftsinformatiker

SirNolwen 
Beitragsersteller
 19.01.2024, 15:04

Ja natürlich, 256 zustände logisch. Warum kann denn ein Integer nicht den Zustand 2^31 speichern, wenn er im Wertebereich liegt?

SirNolwen 
Beitragsersteller
 19.01.2024, 15:06
@GuteAntwort2021

Das bedeutet bei 8 Bit geht der Wertebereich auch nur bis 2^7 - 1?

GuteAntwort2021  19.01.2024, 15:08
@SirNolwen

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.

jo135  19.01.2024, 15:15
@GuteAntwort2021

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.

GuteAntwort2021  19.01.2024, 15:17
@jo135
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.

https://docs.oracle.com/en/java/javase/21/docs/api/java.base/java/lang/Byte.html#compareUnsigned(byte,byte)


CyborgBeta  19.01.2024, 17:09

Doch, char ...

jo135  19.01.2024, 17:25
@CyborgBeta

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.

Woher ich das weiß:Studium / Ausbildung

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


SirNolwen 
Beitragsersteller
 19.01.2024, 14:59

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?