今やっていること
JIS X3010 : 2003 を読んでいます。
疑問
JIS X3010 : 2003 p.28 より引用
ビットフィールド以外のオブジェクト(unsigned char 型以外の型をもつ)に格納した値は、nをこの型のオブジェクトのバイト単位の大きさとして、n×CHAR_BIT個のビットで表す。この値をunsigned char [n]型のオブジェクトに(例えば, memcpy を用いて)コピーすることができる。コピーした結果のバイトの集合を, この値のオブジェクト表現(object representation)と呼ぶ。(中略)NaNを除き,同じオブジェクト表現をもつ二つの値の比較の結果は等しい。
このような記載から、オブジェクト表現(ビットの列)が同じであれば == 演算子の比較結果は1を返すと解釈したため、以下のプログラムの実行で(assertにかからなければ) equal が表示されるのではないかと考えましたが、そのようにはなりません。(equal は表示されず、finish で終了します)
私の解釈は、どのように間違えていますか。
よろしくお願いします。
該当のソースコード
C
1#include <assert.h> 2#include <memory.h> 3#include <stdio.h> 4 5#define SIZE sizeof(int) 6 7int main(void) { 8 static_assert((sizeof(int) == sizeof(float)), 9 "Required sizeof(int)==sizeof(float)"); 10 int i = 0b01000000010101010101010101010101; 11 // 0'10000000'10101010101010101010101 12 // 符号部'指数部'仮数部 13 float f; 14 15 // そのままコピー 16 memcpy(&f, &i, SIZE); 17 18 // 全然違う値であることを表示 19 printf("%d %f\n", i, f); 20 21 // ビット列は確かに同じであることをチェック 22 { 23 unsigned char rep_i[SIZE]; 24 unsigned char rep_f[SIZE]; 25 memcpy(rep_i, &i, SIZE); 26 memcpy(rep_f, &f, SIZE); 27 for (size_t index = 0; index < SIZE; ++index) { 28 assert(rep_i[index] == rep_f[index]); 29 } 30 } 31 32 // ビット列が同じ = オブジェクト表現が同じ なはずなのに? 33 if (f == i) { 34 puts("equal"); 35 } 36 37 puts("finish"); 38}
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/12 04:06