3

この小さなプログラムでは:

#include <unistd.h>
#include <stdint.h>
#include <stdio.h>

int main() {
    uint8_t a = 0;
    uint8_t b = 255;

    if (a == (b + 1)) {
        printf("Equal\n");
    } else {
        printf("Not equal\n");
    }

    if (a == ((b + 1) & 0xFF)) {
        printf("Equal\n");
    } else {
        printf("Not equal\n");
    }       
}

私は得る:

Not Equal
Equal

強制的に最後の 8 ビットを取らないと比較できないのはなぜですか? ここで符号なし算術演算のニュアンスが欠けていると思います...

それが違いを生む場合、私はgcc 4.4.5を使用しています。

4

2 に答える 2

8

整数の昇格により、==and+演算子の両方のオペランドが に昇格されintます。

表現:

a == (b + 1)

は次と同等です。

0 == 256

これは誤りです。

式:a == (uint8_t) (b + 1)は、期待する結果 (true) を提供します。別の解決策は、2 番目のステートメントの& 0xFFように使用することです。if

于 2012-04-09T20:37:05.907 に答える
2

1は整数なので、式は に昇格されintます。このタイプでは、比較は0 == 256. それ以外の場合は、8 桁だけでandを強制しているため、比較は成立します。

于 2012-04-09T20:40:33.240 に答える