Wenn wir den int schreiben, um zu doubeln, wird die tatsächliche Adresse, in der int gespeichert ist, geändert?

8

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?

    
Prince Vijay Pratap 06.06.2015, 13:03
quelle

5 Antworten

5

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:

%Vor%

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!

    
banach-space 06.06.2015, 13:11
quelle
2

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.

    
Olaf 06.06.2015 13:49
quelle
0

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.

    
Amit Sharma 06.06.2015 13:21
quelle
0
  

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:

  1. Im Allgemeinen müssen Sie davon ausgehen, dass die Adresse anders ist
  2. in diesem Fall haben die Typen nicht einmal die gleiche Größe
  3. in meinem Beispiel wird später auf i und
  4. zugegriffen
  5. In der Realität ist das wahrscheinlich keine gute Idee - je nachdem, was nach der Umwandlung in eine moderne CPU passieren wird, ist es wahrscheinlich, dass es in ein spezielles Register geschrieben wird, das der Fließkommaverarbeitung gewidmet ist wird nicht derjenige sein, in dem int war.
Marcus Müller 06.06.2015 13:06
quelle
0

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.

    
Hurkyl 06.06.2015 18:43
quelle

Tags und Links