Ich möchte wissen, dass, wenn wir den int schreiben, um zu verdoppeln, das tatsächliche Ergebnis, in dem int gespeichert wird, verändert oder erhöht wird? Weil int ist von 4 Bytes (nehmen wir an) und wenn wir es typecast zu verdoppeln, was von 8 Bytes ist (Annahme) dann ist dann auch die Größe erhöht, um den Wert von double zu speichern? Und bitte gehen Sie ruhig auf mich, wenn es eine dumme Frage ist?
Die Umwandlung wirkt sich nicht auf die Variable und den entsprechenden Speicher aus. Es ist nur ein Hinweis für den Compiler, wie die Bits zu interpretieren sind, die sich an dem gegebenen Ort befinden.
In Marcus' Beispiel:
%Vor% d
ist eine neue Variable an einem völlig neuen Ort. Der ursprüngliche Wert i
ist nicht betroffen. Wenn Sie jedoch anfangen, mit Zeigern zu spielen, müssen Sie vorsichtig sein:
Wenn double
nun 8 Byte breit ist, beachten Sie, dass Sie mit p
/ Compiler davon ausgehen, dass er auf einen Speicherort verweist, der 8 Byte Speicher für die Variable zugewiesen hat, auf die er verweist. Dies ist jedoch nicht richtig, weil es tatsächlich auf i
zeigt, was nur 4 Bytes breit ist (angenommen, dass int
4 Bytes breit ist).
BEARBEITEN
Dies ist eine (relativ) neue Bearbeitung, die durch OPs motiviert ist, in den Kommentaren eine Klarstellung vorzunehmen. Das OP möchte wissen:
Was passiert mit der Speicheradresse von sum, wenn es typecast wird? Jetzt geben Sie den gespeicherten Wert der Summe an anderer Stelle im Speicher ein
und hier ist der Code:
%Vor% In den obigen drei Codezeilen ist ziemlich viel los. Wichtig dabei ist jedoch, dass die Variable sum
überhaupt nicht verändert wird. Es wird nur als Argument zusätzlich verwendet. Um zwei Variablen hinzuzufügen, benötigen Sie nur die entsprechenden Werte. Vor dem Hinzufügen kopiert der Compiler höchstwahrscheinlich die beiden Variablen in Register. Da Sie auf ein Double-Casting umstellen, speichert der Compiler sehr wahrscheinlich den Wert von sum
in einem 64-Bit breiten Register (vorausgesetzt, Double ist 64 Bit breit) und das war's. Beachten Sie jedoch, dass dies implementierungsspezifisch ist und von Compiler zu Compiler variieren wird. Es ist nicht etwas, das durch den C-Standard spezifiziert ist.
An diesem Punkt, wenn Sie mehr verstehen wollen, ist es das Beste, das Assembly zu kompilieren und zu versuchen, das zu verstehen. Hoffe das hilft!
Das ist die gleiche Frage wie "in a = b + c * d;
wo ist das Zwischenergebnis von c * d
gespeichert?".
Einfache Antwort: in einer temporären Variablen, die vom Compiler verwaltet wird. Dies wird höchstwahrscheinlich ein Register sein. Der Sprachstandard definiert das nicht - warum eigentlich?
Die Typumwandlung ähnelt tatsächlich -b
(b negiert). Dies müsste auch irgendwo vor der Verwendung gespeichert werden.
Beachten Sie, dass der ursprüngliche Wert nicht geändert wird und die empfangende Variable trotzdem vom richtigen Typ sein muss (das ist ein Grund, warum Sie die empfangende Variable nicht typisieren können).
Die Konvertierung von int in double / float wird vom Compiler implizit ausgeführt, so dass keine explizite Umwandlung erforderlich ist. In solchen Fällen sollte sie nicht verwendet werden, da dadurch das Problem durch spätere Änderungen an den Typen verdeckt wird.
Wenn wir das int
auf double
tippen, wird das tatsächliche Ergebnis, in dem int gespeichert ist, geändert oder erhöht?
Nein, Typumwandlung ist nur eine Möglichkeit, eine Variable von einem Datentyp in einen anderen Datentyp zu konvertieren.
wenn wir
machen %Vor% Tatsächlich machen wir das arithmetic promotion
. Da double
von 8 Byte
und int
von 4 Byte
ist. Daher würde es keinen Verlust geben. Aber umgekehrt ist das nicht wahr.
Typkonvertierungen können implizit sein, die vom Compiler automatisch ausgeführt werden, oder sie können explizit durch Verwendung des Darstellungsoperators angegeben werden.
Die übliche arithmetische Konvertierung wird unter Verwendung der folgenden Hierarchie durchgeführt.
Ich möchte wissen, dass, wenn wir das int eingeben, um zu verdoppeln, das tatsächliche Ergebnis, in dem int gespeichert wird, verändert oder erhöht wird?
Da int und double in C zwei verschiedene Typen sind, kann ja das Umwandeln eines int in ein double nicht an derselben Stelle vorkommen, an der das int war - auch wenn diese beiden Typen die gleiche Größe hatten.
Zur Veranschaulichung: Wenn das Casting die ursprüngliche Variable überschrieben hat, was würden die Auswirkungen von
sein %Vor%sein?
BEARBEITEN: @Dani hat das hinzugefügt
Das Double kann dieselbe Adresse belegen, wenn das int nicht mehr benutzt wird.
Ja, Compiler können prüfen, ob auf eine Variable zu einem späteren Zeitpunkt zugegriffen werden kann und ob sie Operationen ausführen können, wenn das hilft; Aber das ist hier nicht der Fall:
i
und int
war. Das Ergebnis der Besetzung wird möglicherweise nirgendwo gespeichert. in der Tat könnte es überhaupt nie berechnet werden!
Wenn ich ein Programmfragment habe
%Vor% Das Programm muss sich nur so verhalten, als ob die Konvertierung stattgefunden hätte und dann wurde das Ergebnis zu 1.0
hinzugefügt, aber solange das Endergebnis korrekt ist, darf das Programm dieses Ergebnis erzeugen in irgendeiner Weise will es; es muss dem Code, den Sie geschrieben haben, nicht einmal ähneln
z.B. Auf einer Maschine mit einer geeigneten Anweisung "add integer a floating point number" kann der Compiler entscheiden, Ihnen ein Programm zu geben, das diese Anweisung verwendet, anstatt eine Konvertierung gefolgt von einer Addition durchzuführen.