C ではint
、 、float
、およびこれらへのポインターのような単純なデータ型の両方をキャストできます。
ここで、ある型へのポインターから別の型の値に変換する場合 (たとえば*float
to からint
)、キャストと逆参照の順序は問題ではないと想定していました。つまり、変数の場合float* pf
、 があります(int) *pf == *((int*) pf)
。数学の可換性のようなもの...
しかし、そうではないようです。テストプログラムを書きました:
#include <stdio.h>
int main(int argc, char *argv[]){
float f = 3.3;
float* pf = &f;
int i1 = (int) (*pf);
int i2 = *((int*) pf);
printf("1: %d, 2: %d\n", i1, i2);
return 0;
}
私のシステムでは、出力は
1: 3, 2: 1079194419
したがって、ポインターのキャストは、値のキャストとは異なる動作をするようです。
何故ですか?2 番目のバージョンが、私が思っていることをしないのはなぜですか?
そして、これはプラットフォームに依存していますか、それとも未定義の動作を何らかの形で呼び出していますか?