C 提取位和移位

C 提取位和移位,c,casting,bitwise-operators,C,Casting,Bitwise Operators,我不明白为什么下面的代码输出是0xFFFFFFF,。。。而不是0xef。请帮助我理解这一点: #包括 main() { int i; int n=4; char txBuff=0; 长数据_b=0xABCDEF; int y=尺寸f(txBuff); printf(“%d\n”,y); txBuff=(数据_b&0xff); 对于(i=0;i>8); printf(“txBuff[%d]=%x,Data_b=%x\n”,i,txBuff,Data_b); } } 输出: 1 txBuff[0]

我不明白为什么下面的代码输出是0xFFFFFFF,。。。而不是0xef。请帮助我理解这一点:

#包括
main()
{
int i;
int n=4;
char txBuff=0;
长数据_b=0xABCDEF;
int y=尺寸f(txBuff);
printf(“%d\n”,y);
txBuff=(数据_b&0xff);
对于(i=0;i>8);
printf(“txBuff[%d]=%x,Data_b=%x\n”,i,txBuff,Data_b);
}
}
输出:

1
txBuff[0]=ffffffef, Data_b=abcd 
txBuff[1]=ffffffcd, Data_b=ab 
txBuff[2]=ffffffab, Data_b=0 
txBuff[3]=0, Data_b=0 

您打印时使用了错误的占位符:

printf("txBuff[%d]=%hhx, Data_b=%lx \n",i,txBuff,Data_b);
当你错误地解释一个论点时,你会看到各种奇怪的结果

此处
%hhx
表示“十六进制转储的
无符号字符”
%lx
表示“十六进制转储的
无符号长字符”

对于它的价值,
clang
有帮助地抱怨:

tbuff.c:17:60: warning: format specifies type 'unsigned int' but the argument has type 'long' [-Wformat]
             printf("txBuff[%d]=%x, Data_b=%x \n",i,txBuff,Data_b);
                                           ~~              ^~~~~~
                                           %lx

执行位操作时使用无符号类型


txBuff
可能变为负值,并将在
printf()
调用中传播到
int

关于类型不匹配,您是对的,但同时此答案并没有解决问题。至少这个问题是关于长十六进制数的。这是因为
txBuff
属于
char
类型,并且包含一个负值,该负值在转换为
int
期间被符号扩展。Re“此处
%hhx
表示“十六进制转储的
char
”,
%lx
表示“十六进制转储的
long
”:这不是您链接到的引用所说的。它说
%hhx
代表
无符号字符
%lx
代表
无符号长字符
。而且,正如Gerhardh指出的,Clang抱怨的转换说明符并不是导致OP出现问题的那个。是的,明白了。谢谢大家尝试
无符号字符txBuff=0    char txBuff = 0;
        ...
        txBuff = (Data_b & 0xff);