-3

今日はプログラムを書いたのですが、何かがおかしいので、このテストプログラムを作りました。0x30000は に等しいです0x3 << 16ね。

このプログラムでは、最初0x30000は が等しいことを示してい0x3 << 16ましたが、最終的には、このプログラムではまったく異なる結果が得られました!

出力は次のとおりです。

MASK1
0000 0000 0000 0011 0000 0000 0000 0000
MASK2
0000 0000 0000 0011 0000 0000 0000 0000
equal!!!!!
Before 1
0000 0000 0001 0010 1101 0110 1000 0111
After 1
0000 0000 0001 0000 1101 0110 1000 0111
Before 2
0000 0000 0001 0010 1101 0110 1000 0111
After 2
0000 0000 0001 0000 0000 0000 0000 0000

出力が afterMASK1MASK2まったく異なるのはなぜですか? MASK1は正しいことを行いましたが、何かがうまくいかないようですMASK2。なぜこれらの結果が得られるのですか?

#include <stdio.h>
#include <string.h>

#define MASK1 0x30000
#define MASK2 0x3 << 16

void show_binary(unsigned long n);

void change_alignment(unsigned long *s);
void eatline(void);
int main(void)
{
    unsigned long   num;
    puts("MASK1");
    show_binary(MASK1);
    puts("MASK2");
    show_binary(MASK2);
    num = 1234567;

    if(MASK1 == MASK2)
        puts("equal!!!!!");
    puts("Before 1");
    show_binary(num);
    num &= ~MASK1;
    puts("After 1");
    show_binary(num);

    num = 1234567;
    puts("Before 2");

    show_binary(num);
    num &= ~MASK2;
    puts("After 2");
    show_binary(num);

    return 0;
}

void show_binary(unsigned long n)
{
    unsigned long   mask = 1;
    int     size = sizeof(unsigned long) * 8;
    char        bin[size + 1];
    int         index = 0;

    bin[size] = '\0';

    while(size > 0)
    {
        if((mask & n) == mask)
            bin[size - 1] = '1';
        else
            bin[size - 1] = '0';

        mask <<= 1;
        size--;
    }

    while(bin[index])
    {
        putchar(bin[index]);
        if(++index % 4 == 0 && bin[index])
            putchar(' ');
    }
    putchar('\n');
}

void eatline(void)
{
    while(getchar() != '\n')
        continue;
}
4

3 に答える 3

6

マクロはテキストの置換であり、 C の優先順位規則はマクロそのものであるという事実に単純に驚かされます。

これ:

num &= ~MASK2;

コンパイラによって次のように認識されます。

num &= ~0x3 << 16;

これはあなたが意味するものではありません(~バインドはシフトよりもタイトであるため、として評価されます(~3) << 16)。マクロに括弧を追加する必要があります。

#define MASK2 (0x3 << 16)

マクロがどのように使用されるかわからないため、マクロを括弧で囲まずに式として定義してはいけません

于 2013-08-15T10:05:49.050 に答える
1

~よりも優先順位が高いため<<、式

~0x3<<16

これは、マクロを評価した結果です

~MASK2

次のように評価されます。

(~0x3)<<16

そしてしないでください:

~(0x3<<16)

したがって、次のことが当てはまります (マクロ置換を手動で実行する場合):

0x30000 == 0x3<<16

==よりも優先順位が低いため<<、次のものはそうではありません。

~0x30000 == ~0x3<<16 // FALSE -> ~0x3<<16 = (~0x3)<<16
于 2013-08-15T10:12:36.053 に答える
0

括弧を忘れたと思います:試してください

#define MASK2 (0x3 << 16)
于 2013-08-15T10:06:20.743 に答える