Zeiger mit gleicher Speicheradresse mit unterschiedlichem Wert

7

Ich habe die Speicheradresse von double zu einer Ganzzahl umgewandelt. Obwohl sie auf die gleiche Adresse zeigen, warum die Werte unterschiedlich sind?

%Vor%

Aber warum sind die Werte anders?

%Vor%     
Hariom Singh 30.07.2017, 22:21
quelle

6 Antworten

6
%Vor%

p und q werden erstellt, indem sie auf den gleichen Speicherort zeigen. Der Speicher enthält eine doppelte (normalerweise 8 Bytes)

Wenn Sie

erstellen %Vor%

Sie sagen dem Compiler ( reintepret_cast< int*> ( &d) ), dass der Wert in d eine ganze Zahl war.

Also sind die Werte der Zeiger die gleichen, aber die Typen nicht.

Beim Ausdrucken

%Vor%

Sie zeigen den richtigen Wert an - so wie er ein- und ausgegangen ist.

beim Ausdrucken

%Vor%

Sie betrachten 4 (typische) Bytes des 8-Byte-Speichers und interpretieren sie als Integer.

Diese sind 0x00, 0x00, 0x00, 0x00

    
mksteve 30.07.2017, 22:29
quelle
9

Angenommen, Sie haben "11" auf ein Stück Papier geschrieben. Das ist elf wenn es Dezimalziffern ist. Das sind zwei, wenn für jeden Wert eine Markierung vorhanden ist. Das sind drei, wenn es binär ist. Wie Sie gespeicherte Informationen interpretieren, wirkt sich auf den Wert aus, den Sie darunter verstehen.

    
David Schwartz 30.07.2017 22:27
quelle
7

Es liegt daran, dass Sie gegen die strenge Aliasing-Regel verstoßen haben undefiniertes Verhalten. Sie können A nicht über einen Zeiger vom Typ B eingeben und einfach so tun, als ob es funktioniert.

TL; DR:

  

wenn Sie int* auf einen Speicher zeigen, der int enthält und dann   Du zeigst ein float* auf diesen Speicher und benutzt ihn als float   Regel. Wenn Ihr Code dies nicht respektiert, dann der Compiler   Optimizer wird höchstwahrscheinlich Ihren Code beschädigen.

    
Sombrero Chicken 30.07.2017 22:28
quelle
3

Die Speicheradressen sind gleich und beide zeigen auf eine Gleitkommazahl doppelter Genauigkeit im Speicher. Sie haben den Compiler jedoch gebeten, einen als Integer und einen anderen als Double zu behandeln. (Ein Zeiger könnte nur eine Speicheradresse sein, aber zur Kompilierzeit hat der Compiler auch Informationen über den Typ.) Es ist einfach so, dass die In-Memory-Darstellung dieser bestimmten doppelt präzisen Zahl wie eine 0 aussieht, wenn sie wie behandelt wird eine ganze Zahl.

    
struthersneil 30.07.2017 22:29
quelle
0

Weil Sie sie selbst auf verschiedene Arten gegossen haben.

    
Phil Krylov 30.07.2017 22:25
quelle
-2

Wenn Sie auto p = (int*)&d; ausführen, bitten Sie den Compiler, einen doppelten Wert in einem Speicherbereich zu speichern, der für eine Ganzzahl reserviert ist. Ein Integer und ein Double werden in verschiedenen Formaten im Speicher eines Computers dargestellt. Ein Double wird unter Verwendung einer Gleitkomma Repräsentation im Speicher gespeichert, während ein Int nicht. Dies ist ein klassisches Beispiel für undefiniertes Verhalten.

    
SCCC 30.07.2017 22:30
quelle

Tags und Links