【发布时间】:2022-01-05 15:57:47
【问题描述】:
所以我编写了下面的代码,它采用 unsigned int ,将其位向左移动 6 位,然后用另一个 int 值替换空的最后 6 位。但是,当我使用值 15 运行代码时,第一步有效,我得到的值为 960(因此左移 6 有效)。但是 or 步骤似乎不起作用,当我实际需要获取 1111111111111111 或即 65535 时,我得到 -1(注意在这种情况下的操作数值为 -1)?任何帮助将不胜感激。我知道这可能与我的类型有关,但 s->data 被定义为无符号整数,而操作数被定义为 int,所以我不知道为什么 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 %d\n", s->data);
s->data = s->data << 6;
printf("AFTER SHIFTING %d\n", s->data);
printf("OPERAND IS %d\n", operand);
// last 6 bits replaced with operand bits of the command
s->data = (s->data | operand);
printf("AFTER OR %d\n", s->data);
}
【问题讨论】:
-
如果您的
operand是-1,这意味着所有位都设置为二进制补码表示。s->data中存储的值无关紧要,因为无论如何都会设置所有位。 -
你的
unsigned int16 位长吗?然后-1与65535在二进制表示方面非常相似。它是 16 位的,全部设置为 1。不同之处只是告诉您的编译器将其视为有符号或无符号值。 -
请编辑您的问题以包括所有必需的类型定义、调用函数的方式以及打印结果的方式。不要只是描述它,而是显示代码。有关预期的更多详细信息,请参阅MCVE。
-
您正在使用
%d打印unsigned int值。您应该使用%u,或者更好的可视化位,%x或%X。 -
改为以十六进制打印,这样更容易“看到”位模式。或者创建一个函数来打印实际的二进制表示以使其更加清晰。