"Typenkonflikt: kann int nicht in Byte konvertieren"

8

Ich habe Leute gesehen, die Fragen über den Fehler "Typenkonflikt: kann nicht int in Byte konvertieren" gestellt haben. Aber sie werden meistens durch arithmetische Operationen verursacht.

Hier ist mein Fall:
(Dies passiert, wenn ich mit Bits in Eclipse Kepler spielen möchte)

%Vor%

Die Sache ist, dass, wenn es 8 Bits ist und die höchste Ziffer 1 ist, der Compiler einen Fehler gibt. Ich möchte wissen warum. Das Präfix 0b bedeutet, dass es ein binäres Literal ist, also warum der Compiler die höchste Ziffer als eine vorzeichenbehaftete int Ziffer oder etwas ähnliches nimmt?

Danke für die Antwort.

[Edit3:]

%Vor%

[Edit2: bitweise & amp; Operation löst auch den Fehler aus]

%Vor%

[Edit1: Screenshot aktualisiert]

    
Weishi Zeng 17.11.2013, 03:42
quelle

3 Antworten

10

Sie haben einen Punkt, weil Sie vermuten, dass es sich um vorzeichenbehaftete Ganzzahlen handelt. In Java werden ALLE Ganzzahlentypen ( byte , short , int , long ) IMMER signiert. Java verwendete Zweierkomplement, um signierte (gelesene "alle") Werte zu speichern. Das bedeutet im Wesentlichen, dass, wenn das erste Bit eines beliebigen Typs (nicht das erste Bit, das im Literal angegeben ist, sondern das erste gespeicherte Bit) 1 ist, die Zahl negativ ist. Wenn es 0 ist, ist es positiv.

Zweitens wichtig ist: Es gibt keine BYTE-Literale in Java. Es gibt int Literale und long Literale. Jeder notierte Numer (sei es in binär (0b Präfix), oktal (0 Präfix), dezimal (kein Präfix) oder hex (0x Präfix)) ist ein Integer Literal, es sei denn, Sie fügen ein L (entweder Klein- oder Großbuchstaben) Es ist long . Es gibt keine Möglichkeit, short oder byte direkt aufzuschreiben.

Nun heißt das, dass all diese Beispiele, die du aufgeschrieben hast, zuerst ein int erstellen. Sie erstellen dort byte s nicht.

Der letzte Teil ist also, was passiert, wenn Sie versuchen, das int in einem byte zu speichern - ohne Casting oder Casting. Wenn Sie explizit Casting betreiben, sagen Sie Java grundsätzlich, dass Sie alle Bits ignorieren, die nicht passen. Sie werden abgeschnitten - auch wenn sich dadurch der Wert der Zahl ändert (Beispiele siehe unten). Wenn du nicht wirfst, werden immer noch Bits geschnitten. Aber Java wird das nicht tun, wenn es den Wert ändert - um sicherzustellen, dass Sie wirklich meinen, was Sie tun.

Um dies alles mit den Beispielen aus der Frage zu verknüpfen:
int 0b01111111 ist 127
byte 0b01111111 ist 127
- & gt; Konvertierung ohne Überlauf möglich, also Java auch ohne explizite Umwandlung

int 0b10000000 ist 128
byte 0b10000000 ist -128
- & gt; Ein Überlauf-Occrus beim Konvertieren, also wirft Java einen Fehler, wenn es keine explizite Umwandlung gibt.

    
Johannes H. 17.11.2013, 03:55
quelle
3

Ich denke Bytes in Java sind signiert, was 0b10000000 außerhalb des Bereichs machen würde. 127 wäre das größte mögliche Byte, der Grund dafür ist die Komplimentdarstellung der beiden negativen Zahlen.

    
richard 17.11.2013 04:16
quelle
1

Byte-Variablen können den Wert 0b1000000 enthalten, da sie jedoch signiert sind, entspricht dies dem Ganzzahlwert -128. Der Grund dafür, dass das Literal nicht konvertiert werden kann, ist, dass der Compiler es als (int) 0b10000000 anzeigt, wenn es als Literal ohne Cast geschrieben wird. Dies ist der Integer-Wert POSITIVE 128.

Jede Integer-Zahl über 127 ist außerhalb der Grenzen eines Bytes, da Bytes signiert sind und nur ganzzahlige Werte von -128 bis 127 enthalten können. Hier kommt der Überlauf ins Spiel (um 128 zu halten, braucht man ein neuntes Bit) für das Zeichen). Jedes Mal, wenn ein vorzeichenbehafteter Wert 1 als höchstwertiges Bit hat, stellt er eine negative Zahl dar. Um also eine Zahl wie 0b10000000 in ein Byte zu schreiben, müssten Sie einen negativen Wert in Ihrem Literal darstellen. Zum Beispiel wäre der Wert -128 gleich dem Int 0b11111111111111111111111110000000, also müssten Sie das als Ihr Literal verwenden, oder, viel einfacher, nur explizit als Byte umwandeln, wie: (byte) 0b10000000

    
user3489270 02.04.2014 12:04
quelle

Tags und Links