C 提取位和移位
我不明白为什么下面的代码输出是0xFFFFFFF,。。。而不是0xef。请帮助我理解这一点: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]
#包括
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);