在 C 中屏蔽一点返回意外结果
0x7F000000
是 32 位二进制的 0111 1111 0000 0000 0000 0000 0000 0000
。0x01000058
是0000 0001 0000 0000 0000 0000 0101 1000
。
当我将这两个数字相加时,我期望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 位编译器。
0x7F000000
is 0111 1111 0000 0000 0000 0000 0000 0000
in 32 bit binary.0x01000058
is 0000 0001 0000 0000 0000 0000 0101 1000
.
When I AND the two numbers together I expect 0000 0001 0000 0000 0000 0000 0000 0000
, but for some reason I get 0.
Here is my code:
#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");
Each of the above comparisons keeps returning zero. Is it something to do with 32/64 bits? I'm using 64-bit compiler.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
如果行包含“0x01000058”,那么 atoi 将返回 0,因为 atoi 使用十进制表示,而不是十六进制 0x 表示。那么 AND 显然为零。尝试打印指令的值。
If line contains "0x01000058" then atoi will return 0 as atoi works with decimal representation, not hex 0x representation. And then the AND obviously is zero. Try to printf the value of instruction.
执行
并确保指导确实符合您的期望。
您还可以:
看看究竟发生了什么。
Do
and ensure that instruction is really what you expect it to be.
you can also do:
To see what exactly is happening.
我刚刚尝试过,它似乎按预期工作。执行
printf( "%x\n", instructions);
来显示该值是什么。I just tried it and it appears to work as expected. Do a
printf( "%x\n", instruction);
to show what the value is.