Problem beim Typ cast
-
Das stimmt schon, allerdings drückst du dann den long-Wert in eine short-Variable rein, das passt einfach nicht, die Variable kann nicht die ganze Zahl aufnehmen.
-
das versteh ich ja auch alles, aber was ich nicht verstehe ist: Warum wird ergebnis nicht automatisch zu long? erfolgt hier kein Typcast?
-
Frandy schrieb:
Warum wird ergebnis nicht automatisch zu long?
Die Variable "ergebnis" darf nicht long werden, da du sie ja als "short" deklariert hast. Variablen können ihren Typ (zum Glück) nicht ändern.
-
OK, jetzt bin ich ganz durcheinander.
Aber wert wird doch auch von short zu long umgewandet und das ist doch auch eine Variable.Und ist ein cast nicht die Eigenschaft von c++, Datentypen automatisch oder auf Wunsch in andere Typen umzuwandeln?
-
Frandy schrieb:
Aber wert wird doch auch von short zu long umgewandet und das ist doch auch eine Variable.
Nein. Eine Variable belegt festen Speicher und existiert nicht nur temporär während eines Ausdrucks. Variablen müssen deklariert werden. Der Typ ihrer Deklaration bleibt während der gesamten Lebensdauer der selbe.
Frandy schrieb:
Und ist ein cast nicht die Eigenschaft von c++, Datentypen automatisch oder auf Wunsch in andere Typen umzuwandeln?
Doch, aber das betrifft nur den Ausdruck innerhalb den Klammern. Der temporäre Ausdruck hat danach den Typ
long. Wenn du diesen einershort-Variablen zuweist, verlierst du wieder Informationen.
-
aber was ist in folgendem Bsp:
[cpp]int wert1;
float wert2;
double wert3;wert3=wert1+static_cast<int>(wert2);
hier wird doch auch aus der Variable wert2 vom typ float in den typ int gecast
-
aber wie würde dann der cast für ergebnis aussehen?

-
Frandy schrieb:
hier wird doch auch aus der Variable wert2 vom typ float in den typ int gecast
Ja. Wo liegt das Problem bzw. was verstehst du daran nicht? Oder worin siehst du einen Widerspruch zu meiner Aussage?
Benutze doch auch die schliessenden [/cpp]-Tags. Im Übrigen gibt es einen Vorschau-Button.

-
Frandy schrieb:
aber wie würde dann der cast für ergebnis aussehen?

Liest du auch, was man dir antwortet?
Ich habe versucht, dir die Sache verständlich zu machen. Aber scheinbar geht es dir nur um den Code. Naja, auf diese Weise wirst du mit Sicherheit nie C++ lernen. Falls ich mich täusche und du tatsächlich an den Hintergründen interessiert bist, gehe bitte auf unsere Antworten ein und stelle nicht solche Fragen.
-
Vielleicht nochmals zusammengefasst:
Stell dir denstatic_cast<long>als Funktion vor, welche den übergebenen Wert alslong-Variable zurückgibt. Es wird also eine Kopie erstellt vom Typlong.
static_cast<long>stellt also nicht den Typ der übergebenen Variable um, sondern es wird eine temporäre Kopie vom neuen Typ erstellt und dort der Wert reingeschrieben.Grüssli
-
mal sehen ob ich es jetzt richtig mache:
[code]
#include<iostream>
using namespace std;
int main(){
short wert,ergebnis;
wert=5891;
ergebnis=static_cast<long>(wert)*14;
cout<<"Das Ergebnis lautet:"<<ergebnis;char p[50];
cin.getline(p,50);
cin.getline(p,50);
}[/cpp]
und wie würde die Befehlszeile aussehen, wenn ich nur ergebnis casten will?
Vieleicht ist das dann die Lösung für mein Problem:

-
OK, ich will nicht den Code, sondern den Hintergrund verstehen. Ich finde es auch super das so viele gleichzeitig mir helfen wollen. Nur in der Zeit wie meine Frage schreibe, kommen verschieden Antworten und dadurch kommt wohl das durcheinander. Ich lese sehr wohl eure Antworten.
Das mit der betrachtungsweise über die Funktion hat mir sehr geholfen das ganze wohl richtig zu sehen. Nur kann ich ergebnis auch casten?
-
Frandy schrieb:
Das mit der betrachtungsweise über die Funktion hat mir sehr geholfen das ganze wohl richtig zu sehen. Nur kann ich ergebnis auch casten?
Du scheinst es noch nicht ganz verstanden zu haben.

Das Ergebnis brauchst du nicht zu casten. Dein Problem hat eigentlich gar nichts mit einem Cast zu tun. Wie ich schon erwähnte, solltest du die Variable mit einem Typ deklarieren, der gross genug ist, um das Resultat zu halten.
-
Servus Manni,
wie gehts alter? Programmierst du immer noch mit C++?
Grüße
Norbärt
-
Hallo Nexus,
Du hast vollkommen recht! Das seh ich auch so und das hab ich auch verstanden.
Der ganze Hintergrund ist vollgender:
Ich arbeite zur Übung und wiederholung immer mal ein paar Aufgaben durch. Nun heist die Aufgabe wie folgt:
Was ist an diesem Programm fehlerhaft?
#include<iostream> using namespace std; int main(){ short wert,ergebnis; wert=5891; ergebnis=wert*14; cout<<"Das Ergebnis lautet:"<<ergebnis; char p[50]; cin.getline(p,50); cin.getline(p,50); }Wertebereichsüberschreitung, Problem erkannt.
Abhilfe durch anderen Variablentyp bei der Deklaration auch klar.Soll nur ergebnis vom Typ long sein, muß die Wertzuweisung für ergebnis so aussehen:(Laut Lösungsvorschlag)
Als Lösung wird eben dieser Typcast wie folgt genannt:
ergebnis=static_cast<long>(wert)*14;so kommt mein Problem zustande.
-
Ups sorry, du bist ja garnicht Manni. Hast ihm so ähnlich geschaut.
-
Frandy schrieb:
Soll nur ergebnis vom Typ long sein, muß die Wertzuweisung für ergebnis so aussehen:(Laut Lösungsvorschlag)
Als Lösung wird eben dieser Typcast wie folgt genannt:
ergebnis=static_cast<long>(wert)*14;Ja. Aber genau genommen ist der Cast auch nicht nötig. Wenn in einem arithmetischen Ausdruck unterschiedliche Typen vorkommen, erhält der gesamte Ausdruck den genaueren Typen. Also hier
int(wegen dem14). Umlongzu erzwingen, könnte man wie bei dir casten, oder aber14l(einlong-Literal) schreiben.Das finde ich ein ziemlich schlechtes Beispiel für den Einsatz von expliziter Typumwandlung...
-
Da kann ich Dir nur Recht geben. Verstehst Du nun warum ich als Anfänger mich dann auch noch mit diesem Bsp. so schwer tu?!
Aber das mit dem cast erzwingen versuch ich doch die ganze Zeit.
int darf es im übrigen auch nicht sein, da ich dann wieder einen Werteberichsüberschreitung habe.
-
Frandy schrieb:
Da kann ich Dir nur Recht geben. Verstehst Du nun warum ich als Anfänger mich dann auch noch mit diesem Bsp. so schwer tu?!
Ja, schon. Zumindest zum Teil.

Aber ich versuche mal, dir ein besseres Beispiel zu liefern:
int a = 24; float b = 5.72f; // Wir möchten nun 3.25 zu dem abgerundeten Produkt von a und b addieren. float c = 3.25f + static_cast<int>(a * b);Hier brauchst du den Cast, da ein Teilausdruck zuerst ausgewertet und in einen ganzzahligen Typen umgewandelt werden soll.
Frandy schrieb:
Aber das mit dem cast erzwingen versuch ich doch die ganze Zeit.
Und ergebnis wird auch automatisch durch int(14) nicht zu int!Auch nachdem es dir mindestens drei Mal gesagt wurde, ändert sich nichts an der Tatsache, dass das nichts mit dem Cast zu tun hat.

-
das hab ich verstanden, Danke für die Erklärung und die Geduld.
Aber wie würdest Du den meine Aufgabe lösen?