11

C++ を正しく理解していないのでしょうか、それともコンパイラのバグでしょうか?

uint8_t a = 0x00;
uint8_t b = 0xFF;

if( a - b == 1 )
{
    doNothing();
}

(ab) の結果が比較演算で第 2 オペランドの型に暗黙的にキャストされたため、doNothing は (予想どおり) 呼び出されません。数値の場合は、signed int です。わかった。

if( a - b == (uint8_t)1 )
{
    doNothing();
}

doNothing はまだ呼び出されていませんが、その理由がわかりません! 数値を明示的に uint8 にキャストしました!

if( (uint8_t)(a - b) == 1 )
{
    doNothing();
}

doNothing が最終的に呼び出されるようになりましたが、これもなぜでしょうか? 2つのuint8の減算はどのようにintを返すことができますか?

コンパイラは、ARM Cortex M3 用の uVision ARMCC です。

4

3 に答える 3

1

ARM Cortex M3 は 32 ビット プロセッサです。したがって、a - b の結果は 0xFFFFFF01 であり、1 と等しくない (32 ビット表現では 1 ==> 0x00000001) ため、doNothing() 関数は呼び出されません!

ケース 2 で、1 を uint8_t に型キャストすると、0xFFFFFF01 は 0x01 と等しくないため、doNothing() 関数は再度呼び出されません!

ケース 3 では、a - b の出力を uint8_t に型キャストすると、a - b の結果は 0x01 となり、これは 1 に等しいため、doNothing が呼び出されます。

于 2013-09-26T17:57:56.280 に答える