2011-01-14 113 views
2

0x7F0000000111 1111 0000 0000 0000 0000 0000 0000中的32位二进制。
0x010000580000 0001 0000 0000 0000 0000 0101 1000屏蔽C中的位返回意外的结果

当我和两个数我希望0000 0001 0000 0000 0000 0000 0000 0000,但由于某种原因,我得到0

这里是我的代码:

#define MASK_binop  0x80000000 
#define MASK_operation 0x7F000000 

int instruction=atoi(line); 
if((MASK_binop & instruction)>0) 
    printf("binop\n"); 
else if((MASK_operation & instruction)>0) 
    printf("operation\n"); 

每个上述比较的不断回零。这与32/64位有关吗?我正在使用64位编译器。

+4

线的价值是什么? – taskinoor 2011-01-14 19:47:40

+0

将无符号有什么区别? – Marlon 2011-01-14 19:50:29

回答

4

如果行包含“0x01000058”,那么atoi将返回0,因为atoi使用十进制表示而不是十六进制0x表示。然后,AND显然是零。尝试打印指令的值。

1

我刚试过,它看起来像预期的那样工作。做一个printf("%x\n", instruction);来显示它的价值。

-1

你使用什么编译器?

好像你的atoi正在返回32位结果。您可以尝试atoi64

更新:

对不起,是我不好。它确实会返回32位32位机器上的int和64位机器上的64位。但是对于32位机器,abit64()可以方便地使用额外的大整数进行操作。

3

printf("%x", instruction); 

,并确保该指令是真的,你希望它是什么。

你也可以这样做:

printf("%x", MASK_binop & instruction); 
printf("%x", MASK_operation & instruction); 

要知道到底发生了什么。