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%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
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.
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, derint
enthält und dann Du zeigst einfloat*
auf diesen Speicher und benutzt ihn alsfloat
Regel. Wenn Ihr Code dies nicht respektiert, dann der Compiler Optimizer wird höchstwahrscheinlich Ihren Code beschädigen.
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.
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.
Tags und Links c++