1

Microchip XC8を使用して、私は構造を持っています

int16_t test;
uint8_t msb = 0xff;
uint8_t lsb = 0xf4;
uint8_t hyst = 0xff; 

test = ((((int16_t)msb)<<8) + (int16_t)lsb) + (int8_t)hyst);

符号付きの数値を使用したため、test は -13 (oxFFF3) になると予想されますが、0xF3 として計算されます。

なんで?

編集: gcc で試したところ、結果は期待どおりです。

4

2 に答える 2

1

intOlaf が正しく指摘したように、 の符号ビットにビットをシフトしているため、幅が 16 の場合、シフト操作は定義された動作を持たない可能性がありますint16_t。その場合、コードに誤りがあり、プラットフォームが実現する可能性のある価値について何も推測できません。

が大きい場合int、式はすべて問題なく、 に収まる正の値のみを加算していますint。ただし、結果の値はint16_t、初期化のために元の値に変換されます。その結果、「実装定義」の変換またはシグナルの発生が発生します。したがって、これらの場合にプラットフォームがどのように動作するか、コンパイラのドキュメントを確認する必要があります。可能であれば、回避することをお勧めします。

于 2015-11-25T13:47:32.393 に答える
0

コメントからOK

int16_t test;
uint8_t msb = 0xff;
uint8_t lsb = 0xf4;
uint8_t hyst = 0xff; 

test = (int16_t)(((uint16_t)msb)<<8) + (uint16_t)lsb) + (int8_t)hyst;

問題を解決します。君たちありがとう!

于 2015-11-25T14:25:30.957 に答える