我有以下代码,我们尝试左移某个值的某些位:
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
,原因是什么,以及如何正确使用它?
答案 0 :(得分:4)
你需要在转移后将其分配回mvb:
mvb = mvb << 8;
答案 1 :(得分:3)
%u
是unsigned long
的错误格式说明符,因此程序行为未定义。请改用%lu
。
请注意,您实际上并没有更改mvb
的值:printf
来电正在原始值mvb
上运行。
写mvb <<= 8
是修复(这是使用按位左移分配运算符),但要小心不要应用超出类型中位数的移位,因为也是在C中未定义的行为。为避免产生疑问,只有在您将一次移位时才会导致未定义的行为:mvb <<= 56
的后续移位对于64位是正常的类型,但mvb <<= (8 + 56)
不。