今天我写了一个程序,但它有问题,所以我做了这个测试程序。好吧,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
为什么之后的输出MASK1
完全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;
}