以下のコードに示すように、longnum
のビットをd1
とd2
の2つのdoubleにコピーしようとしています。ポインタキャスト+逆参照それぞれ「ビットごとに」および「ビットごとに」となります。longと異なる値をコピーした2つのdoubleが
# include <stdio.h>
int main(void) {
long longnum = 0xDDDDDDDDDDDDDDDD;
double d1 = *((double*)(&longnum));
double d2 = longnum & 0xFFFFFFFFFFFFFFFF;
printf("%ld\n\n",longnum);
printf("%lf\n\n",d1);
printf("%lf\n",d2);
return 0;
}
下の出力に示すように、両方のダブルスが同じ方法で印刷されないという問題があります。
-2459565876494606883
-1456815990147462891125136942359339382185244158826619267593931664968442323048246672764155341958241671875972237215762610409185128240974392406835200.000000
15987178197214945280.000000
の大きさ、重の最大サイズを考えると、実際に印刷された2倍の賢明な出力だ巨大な数だと私には思えます。
とにかく厳密なエイリアシングルールのためです。 –
「long」は必ず「double」と同じサイズである必要はありません。 –
1)正しいサイズの**符号なし**固定幅タイプを使用する必要があります。 **そして** '_Static_assert'を使って' double'が同じサイズを持つようにします。それでも実装定義はされますが、少なくとも定義されていない動作は呼び出されません。 – Olaf