2017-12-20 33 views
-4

AとBの値の結果は次のとおりです。C言語のデータ構造を説明してください

A:-121.000000, B:4294967296.000000 

なぜAとBが異なるのだろうと思います。

データ構造に関する基本的な知識を教えてください。最初のケースで

int main() { 

uint8_t data[8]; 
data[0] = 0x3C; 
data[1] = 0x00; 
data[2] = 0x00; 
data[3] = 0x00; 
data[4] = 0x87; 
data[5] = 0xFF; 
data[6] = 0xFF; 
data[7] = 0xFF; 

float A; 
float B; 

A = 
    (uint8_t) data[4] | 
    (uint8_t) data[5] << 8 | 
    (uint8_t) data[6] << 16 | 
    (uint8_t) data[7] << 24; 

B = 
    (uint32_t) data[4] | 
    (uint32_t) data[5] << 8 | 
    (uint32_t) data[6] << 16 | 
    (uint32_t) data[7] << 24; 

printf("A:%f, B:%f", A, B); 

return 0; 
} 
+0

理由は、暗黙の整数昇格です。それ以来多くの同様の質問があります。リンクされた複製を研究してください。 – Lundin

答えて

0

、右辺の式の型はintであり、その値は-121です。 2番目のケースでは、タイプはuint32_tであり、値はuint32_t(-121) == 4294967175です。後者はfloatで正確に表すことができないので、丸められます。

+1

ここでの微妙なことは、 'uint8_t'は符号なし型ですが、シフト演算の左辺のオペランドとして使用すると、' unsigned int'ではなく 'int'に昇格します。最後に署名された左シフトの結果は負のint値になります(技術的には、符号の変更はオーバーフローとみなされます)。これはfloatに変換すると負のままです。 –

関連する問題