407 Stimmen

byte + byte = int... warum?

Betrachten Sie diesen C#-Code:

byte x = 1;
byte y = 2;
byte z = x + y; // ERROR: Cannot implicitly convert type 'int' to 'byte'

Das Ergebnis der Berechnungen, die an byte (oder short ) wird implizit in eine Ganzzahl zurückgewandelt. Die Lösung besteht darin, das Ergebnis explizit in ein Byte zurückzuwandeln:

byte z = (byte)(x + y); // this works

Ich frage mich nur, warum? Ist es architektonisch? Philosophisch?

Wir haben:

  • int + int = int
  • long + long = long
  • float + float = float
  • double + double = double

Warum also nicht?

  • byte + byte = byte
  • short + short = short ?

Ein wenig Hintergrundinformationen: Ich führe eine lange Liste von Berechnungen mit "kleinen Zahlen" (d.h. < 8) durch und speichere die Zwischenergebnisse in einem großen Array. Mit einer Byte-Array (anstelle eines int-Arrays) ist schneller (wegen der Cache-Treffer). Aber die umfangreichen Byte-Casts, die über den Code verteilt sind, machen ihn noch viel unleserlicher.

-1voto

jrista Punkte 31522

Zusätzlich zu all den anderen großartigen Kommentaren wollte ich noch einen kleinen Leckerbissen hinzufügen. Viele Kommentare haben sich gefragt, warum int, long und so ziemlich jeder andere numerische Typ nicht auch dieser Regel folgt... einen "größeren" Typ als Antwort auf arithmetisch zurückgibt.

Viele Antworten hatten mit der Leistung zu tun (na ja, 32 Bits sind schneller als 8 Bits). In Wirklichkeit ist eine 8-Bit-Zahl für eine 32-Bit-CPU immer noch eine 32-Bit-Zahl..... Selbst wenn man zwei Bytes hinzufügt, wird das Datenpaket, mit dem die CPU arbeitet, trotzdem 32 Bit groß sein... also wird das Hinzufügen von Ints nicht "schneller" sein als das Hinzufügen von zwei Bytes... für die CPU ist das alles dasselbe. JETZT wird das Hinzufügen von zwei Ints schneller sein als das Hinzufügen von zwei Longs auf einem 32-Bit-Prozessor, weil das Hinzufügen von zwei Longs mehr Microops erfordert, da man mit Zahlen arbeitet, die breiter als das Wort des Prozessors sind.

Ich denke, der Hauptgrund, warum die Byte-Arithmetik zu Ints führt, ist ziemlich klar und einfach: 8 Bits reichen einfach nicht sehr weit! :D Mit 8 Bit hat man einen vorzeichenlosen Bereich von 0-255. Das ist no Die Wahrscheinlichkeit, dass man auf die Grenzen eines Bytes stößt, ist SEHR hoch, wenn man sie in der Arithmetik verwendet. Die Wahrscheinlichkeit, dass einem die Bits ausgehen, wenn man mit Ints, Longs, Doubles usw. arbeitet, ist jedoch deutlich geringer... so gering, dass wir nur sehr selten auf die Notwendigkeit von mehr Bits stoßen.

Die automatische Umwandlung von Byte in Int ist lógico weil die Skala eines Bytes so klein ist. Die automatische Umwandlung von int in long, float in double usw. ist nicht logisch weil diese Zahlen eine erhebliche Größenordnung haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X