我对C的位运算有问题,不能将两个数字“合并”在一起。假设我的数字为0x0A (或任何两个十六进制数字),并且希望用0xF替换左数字,例如: 00001010 -> 11111010按位表示。
我想做的是:
因此:
步骤1前后的十六进制数:移位后所需的十六进制数: F0 (11110000)或门:
00001010或11110000 = 11111010 = 0xFA
但是,出于某种原因,我的C代码正确地完成了上述所有操作,并且在应用OR时,它给出了0xFFFFFFA(8字节)的结果。
在C是如何按位工作的问题上,我缺少了什么吗?
请注意,我使用了sizeof( int ),因为代码应该能够解释4或8字节int。
谢谢你提前提供帮助!
int setHexDigit(char* digitPairPtr, int digitPos, char hexDigit)
{
int return_value = 0;
if( (hexDigit>='0' && hexDigit<='9') || (hexDigit>='A' && hexDigit <='F'))
{
if(digitPos==0)
{
hexDigit = ((hexDigit<='9' && hexDigit>='0') ? (hexDigit-'0') : ( (hexDigit>='A' && hexDigit<='F') ? (hexDigit-('A'-10)) : (-1))); //THIS LINE IS NOT IMPORTANT
*digitPairPtr = ((unsigned)*digitPairPtr<<((sizeof(int))*8-4))>>((sizeof(int))*8-4); //Drop left digit.
hexDigit = (hexDigit << 4);
*digitPairPtr = *digitPairPtr | hexDigit;
return_value=1;
}
else
{
//For later
}
}
return return_value;
}
int main()
{
char c = 0x0A;
setHexDigit(&c,0,'F');
printf("\n%X", c);
return 0;
}
发布于 2022-05-30 12:38:03
我认为问题在printf
语句中。如果您使用的是char
签名的编译器,则将c
传递给printf
将其从0xFA
扩展到0xFFFFFFFA
。尝试使用unsigned char
代替。
https://stackoverflow.com/questions/72434399
复制相似问题