gpt4 book ai didi

c - 为什么使用位掩码 0x30000 与使用 0x3 << 16 会产生不同的结果?

转载 作者:行者123 更新时间:2023-11-30 20:45:27 25 4
gpt4 key购买 nike

今天写了一个程序,但是出了问题,所以做了这个测试程序。那么, 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

为什么 MASK1MASK2 之后的输出完全不同? 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;
}

最佳答案

您只是被宏是文本替换这一事实所震惊,而 C's precendence rules他们就是这样。

这个:

num &= ~MASK2;

将被编译器视为:

num &= ~0x3 << 16;

这不是你的意思(因为 ~ 比移位结合得更紧,所以它被评估为 (~3) << 16 )。您必须在宏中添加括号:

#define MASK2 (0x3 << 16)

人们不应该将宏定义为表达式而不将其括在括号中,因为您不知道如何使用该宏。

关于c - 为什么使用位掩码 0x30000 与使用 0x3 << 16 会产生不同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18250382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com