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.

13voto

BFree Punkte 100035

Ich erinnere mich, dass ich einmal etwas von Jon Skeet gelesen habe (ich kann es jetzt nicht finden, ich werde weiter suchen), in dem es darum ging, dass Byte den +-Operator nicht wirklich überlastet. In der Tat, wenn Sie zwei Bytes wie in Ihrem Beispiel hinzufügen, wird jedes Byte tatsächlich implizit in einen int umgewandelt. Das Ergebnis ist dann natürlich ein int. Zu der Frage, WARUM dies so konzipiert wurde, warte ich auf einen Beitrag von Jon Skeet selbst :)

EDITAR: Ich habe es gefunden! Tolle Infos zu genau diesem Thema aquí .

8voto

samoz Punkte 54011

Der Grund dafür ist der Überlauf und die Übertragungen.

Wenn Sie zwei 8-Bit-Zahlen addieren, kann es sein, dass sie in das 9.

Beispiel:

  1111 1111
+ 0000 0001
-----------
1 0000 0000

Ich weiß es nicht genau, aber ich nehme an, dass ints , longs und doubles erhalten mehr Platz, da sie ohnehin schon recht groß sind. Außerdem sind sie ein Vielfaches von 4, was für Computer effizienter zu handhaben ist, da die Breite des internen Datenbusses 4 Bytes oder 32 Bits (64 Bits werden jetzt immer häufiger) breit ist. Byte und Short sind ein wenig ineffizienter, aber sie können Platz sparen.

5voto

Ryan Punkte 4522

Aus der C#-Sprachbeschreibung 1.6.7.5 7.2.6.2 Binary numeric promotions werden beide Operanden in int umgewandelt, wenn sie nicht in mehrere andere Kategorien passen. Ich vermute, dass sie den +-Operator nicht überladen haben, um Byte als Parameter zu akzeptieren, sondern wollen, dass er sich einigermaßen normal verhält, also verwenden sie einfach den Datentyp int.

C# Sprache Spezifikation

4voto

mqp Punkte 66863

Mein Verdacht ist, dass C# tatsächlich die operator+ festgelegt am int (die eine int es sei denn, Sie befinden sich in einem checked Block), und implizit werden beide Ihrer bytes / shorts a ints . Aus diesem Grund erscheint das Verhalten inkonsistent.

3voto

PeterAllenWebb Punkte 10013

Dies war wahrscheinlich eine praktische Entscheidung der Sprachentwickler. Schließlich ist ein int ein Int32, eine 32-Bit-Ganzzahl mit Vorzeichen. Wann immer Sie eine Integer-Operation mit einem Typ kleiner als int durchführen, wird sie von den meisten 32-Bit-CPUs ohnehin in eine 32-Bit-Integer-Zahl mit Vorzeichen umgewandelt. Das, zusammen mit der Wahrscheinlichkeit von überlaufenden kleinen Ganzzahlen, hat wahrscheinlich den Deal besiegelt. Sie ersparen sich die ständige Überprüfung auf Über- und Unterlauf, und wenn das Endergebnis eines Ausdrucks auf Bytes im Bereich liegt, obwohl es in einem Zwischenstadium außerhalb des Bereichs liegt, erhalten Sie ein korrektes Ergebnis.

Ein weiterer Gedanke: Der Über-/Unterlauf bei diesen Typen müsste simuliert werden, da er auf den wahrscheinlichsten Ziel-CPUs nicht natürlich auftreten würde. Warum sich die Mühe machen?

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