C语言unsigned int左移后与int做OR运算输出负数问题求助
问题排查与修复方案
核心原因1:输出格式符不匹配
s->data是unsigned int类型,你在printf中使用了针对有符号整数的%d格式符打印。%d会将内存中的二进制值按有符号int规则解析:如果值的最高位为1,就会被识别为负数输出。你预期的65535(对应16位二进制全1)用%d打印时,就会被识别为有符号的-1。
- 修复方案:打印
s->data时改用%u(十进制无符号格式)或%x(十六进制格式)即可看到正确数值。
核心原因2:位或操作未限制operand的有效位范围
你的需求是仅替换s->data的低6位,但int类型的operand为-1时,补码表示下所有二进制位全为1,直接做或运算会把s->data的高位也全部置为1。如果后续operand可能为其他值,需要增加掩码操作只保留低6位。
- 修复方案:将位或代码改为:
s->data = s->data | (operand & 0x3F);
其中0x3F是低6位全1的掩码,可确保只有operand的低6位会被合并到s->data中。
修正后的完整代码
typedef struct state { int x, y, tx, ty; unsigned char tool; unsigned int start, data; bool end;} state; void dataCommand(int operand, state *s) { // shifts bits of current data fields six positions to left printf("BEFORE SHIFTING %u\n", s->data); s->data = s->data << 6; printf("AFTER SHIFTING %u\n", s->data); printf("OPERAND IS %d\n", operand); // last 6 bits replaced with operand bits of the command s->data = s->data | (operand & 0x3F); printf("AFTER OR %u\n", s->data); }
内容的提问来源于stack exchange,提问作者avii
相关产品推荐
相关产品推荐

