今日はプログラムを書いたのですが、何かがおかしいので、このテストプログラムを作りました。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
出力が afterMASK1
とMASK2
まったく異なるのはなぜですか?
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;
}