Laden...

Warum ist byte+byte implizit ein int? (und analoge Überlegungen für char+char und float+float)

Erstellt von Seikilos vor 12 Jahren Letzter Beitrag vor 12 Jahren 2.056 Views
S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 12 Jahren
Warum ist byte+byte implizit ein int? (und analoge Überlegungen für char+char und float+float)

Hallo,

wenn ich folgendes versuche:


var result =  (byte)4+(byte)5;
result.GetType() // Int32

bekomme ich einen int in result.
Ich habe gerade in der Language Spec und bei MSDN (Implicit Numeric Conversions Table (C# Reference), byte (C# Reference)) geguckt. Da steht zwar etwas über implizite Konvertierung (hier von byte zu int), aber ich verstehe den Grund nicht.

Ich habe zwei bytes auf denen ich den +-Operator anwende und das Ergebnis ist ein int.
Wo ist hier die implizite Konvertierung? Konvertiert der +-Operator oder die Zuweisung zu der Variable?

Weiterführende Links willkommen, denn ich finde bis jetzt nichts explizites (:))

Life is a short

2.891 Beiträge seit 2004
vor 12 Jahren
2.298 Beiträge seit 2010
vor 12 Jahren

Interessante Frage. Wobei ich mir die bei der Addition zweier Byte weniger stelle als bei der Addition zweier chars.

Bei folgendem Code hätte ich eher einen String erwartet:


var result = 'A' + 'B';

Das Resultat ist aber ebenfalls ein Integer.

Warum stelle ich mir die Frage bei der Konvertierung zweier Byte nicht? Grundlegend können moderne CPU's mit einem einem Integer performanter rechnen. Ein weiterer Grund den ich so aber aus dem Link von dN!3L übernommen habe ist, dass die Addition von Bytes ganz schnell auch mal zu einem Fehler führen kann. Schließlich gibt es da eine Obergrenze was die größe des Byte-Wertes angeht.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

S
Seikilos Themenstarter:in
753 Beiträge seit 2006
vor 12 Jahren

Den Link kannte ich nicht, aber obwohl er keine eindeutige Antwort gibt, bestätigt er meine Vermutung. Danke.

Edit: Der hier hilft: byte + byte = int… why?

@inflames2k

dass die Addition von Bytes ganz schnell auch mal zu einem Fehler führen kann. Schließlich gibt es da eine Obergrenze was die größe des Byte-Wertes angeht.

Das finde ich konstruiert, denn du kannst auch bei zwei ints an die Grenze stoßen.
Kann gerade nicht überprüfen, aber liefert

var f = (float)4 +(float)5;

auch ein double zurück?

Life is a short

2.298 Beiträge seit 2010
vor 12 Jahren

Nö das resultat zweier Float-Werte ist viel interessanter. Ein Single-Wert.

Code:


var res = (float)1.5 + (float)3.5;
Console.WriteLine(res.GetType().ToString() + ": " + res);

Ausgabe: System.Single: 5

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo inflames2k,

dass float das Alias für System.Single ist, hast du berücksichtigt?

Hallo zusammen,

spannend ist das aber wohl ohnehin nicht, denn bei var nimmt der Compiler halt das was er am besten passend findet. Wenn hier explizit der Typ angegeben wird, so gibts das Problem gar nicht.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

1.346 Beiträge seit 2008
vor 12 Jahren

Single = float. float ist das Schlüsselwort. Der passene Typ ist System.Single 😉

Das Argumen, dass 2 bytes addiert schnell was größeres gibt halte ich für nicht Aussagekräftig. Das selbe Spiel kann man mit nem int auch machen. Das ergibt auch schnell ne größere Zahl. Der Grund ist, mMn, dass CPUs nicht mit bytes rechnen können. Sie rechnen mit Integers (32bit) oder Longs(64bit). Aber auch unter 64bit macht .net ein integer draus.

Nachtrag: na toll. gfoidl war schneller^^

2.298 Beiträge seit 2010
vor 12 Jahren

dass float das Alias für System.Single ist, hast du berücksichtigt?

Nö, das hab ich jetzt ausgeblendet. 😃

Zu deinem Edit: Stimm ich dir im Grunde zu, allerdings mit folgender Einschränkung. Warum sollte bei 'A' + 'B' der passendste Typ System.Int32 sein? Wie gesagt ich hätte einen String erwartet.

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

1.346 Beiträge seit 2008
vor 12 Jahren

chars sind auch Zahlen. und klar kommt wenn du sie addierst wieder eine zahl raus.

6.911 Beiträge seit 2009
vor 12 Jahren

Hallo inflames2k,

wegen

Zitat von: char
Ein char kann implizit konvertiert werden in ushort, int, uint, long, ulong, float, double oder decimal.

und weil der Compiler dann das int am passensten findet. Das hat mit einem String noch nichts zu tun, auch wenn ein String als IEnumerable<char> verstanden werden kann.

mfG Gü

Stellt fachliche Fragen bitte im Forum, damit von den Antworten alle profitieren. Daher beantworte ich solche Fragen nicht per PM.

"Alle sagten, das geht nicht! Dann kam einer, der wusste das nicht - und hat's gemacht!"

2.298 Beiträge seit 2010
vor 12 Jahren

chars sind auch Zahlen. und klar kommt wenn du sie addierst wieder eine zahl raus.

Irgendwie ist heut nicht mein Tag. 🤔

Klar muss ja die Addition zweier Chars ein Integer liefern. - Tuts ja bei dem versuch folgendes durchzuführen auch:


string result = 'A' + 'B';

Irgendwie hab ich das grad völlig außer Acht gelassen obwohl ich schon tausende male drüber gestolpert bin...

Wissen ist nicht alles. Man muss es auch anwenden können.

PS Fritz!Box API - TR-064 Schnittstelle | PS EventLogManager |

Hinweis von gfoidl vor 12 Jahren

Dann lassen wir es dabei, denn sonst gehts sehr in Richtung [Hinweis] Wie poste ich richtig? Punkt 1.1.1 😉