为什么左移操作不起作用
why the left shift operation does not work
我有以下代码,我们在其中尝试左移一个值的某些位:
int main()
{
unsigned long mvb = 1;
mvb << 8;
printf("The shift value is %u\n", mvb);
mvb << 56;
printf("The shift value is %u\n", mvb);
}
但是这两个操作的结果都是1
,这是什么原因,如何正确使用?
你需要在移动后将它分配回mvb,如:
mvb = mvb << 8;
%u
是 unsigned long
的错误格式说明符,因此程序行为未定义。请改用 %lu
。
请注意,您实际上并未更改 mvb
的值:printf
调用是对 mvb
的原始值进行操作。
编写 mvb <<= 8
是解决方法(这是使用按位左移赋值运算符),但请注意不要应用超出您类型中的位数的移位,因为那是 also C 中的未定义行为。为避免疑义,仅当您一次 移位太多位时才会出现未定义行为 :[=17 的后续移位=] 适合 64 位类型,但 mvb <<= (8 + 56)
会 而不是 。
我有以下代码,我们在其中尝试左移一个值的某些位:
int main()
{
unsigned long mvb = 1;
mvb << 8;
printf("The shift value is %u\n", mvb);
mvb << 56;
printf("The shift value is %u\n", mvb);
}
但是这两个操作的结果都是1
,这是什么原因,如何正确使用?
你需要在移动后将它分配回mvb,如:
mvb = mvb << 8;
%u
是 unsigned long
的错误格式说明符,因此程序行为未定义。请改用 %lu
。
请注意,您实际上并未更改 mvb
的值:printf
调用是对 mvb
的原始值进行操作。
编写 mvb <<= 8
是解决方法(这是使用按位左移赋值运算符),但请注意不要应用超出您类型中的位数的移位,因为那是 also C 中的未定义行为。为避免疑义,仅当您一次 移位太多位时才会出现未定义行为 :[=17 的后续移位=] 适合 64 位类型,但 mvb <<= (8 + 56)
会 而不是 。