次のコードの場合:
void main()
{
int i;
float a=5.2;
char *ptr;
ptr=(char *)&a;
for(i=0;i<=3;i++)
printf("%d ",*ptr++);
}
o/p を 102 102 -90 64 として取得しています。なぜですか?文字ポインターは各バイトの MSB ビットをどのように扱うのですか?
char が符号付きか符号なしかは実装定義です。システムの char データ型が署名されていることは明らかです。したがって、MSB は符号ビットです。
5.2
浮動小数点値をバイナリ形式に変換すると、次のようになります。
5.2 = 01000000 (=64) 10100110 (=166) 01100110 (=102) 01100110 (= 102)
3 番目のバイト ( ) を( 内で) 値166
に変換すると、 が得られます。signed char
[-128, 127]
-90
でプログラムをコンパイル-funsigned-char
して、出力として取得102 102 166 64
します。
あなたの場合、明らかに最上位ビットを符号ビットとして扱います。つまり、実装char
では、2 の補数表現を持つ符号付き整数型です。
あなたの場合、char
は符号付きビット表現を使用しています。値に関する限り、作業中のシステムのエンディアンに依存します。