使用unsigned long类型进行位移会产生错误的结果

bor*_*ero 6 c unsigned bit-shift

我有点困惑,因为我想unsigned long在我的系统上初始化一个大小为8字节的类型的变量(在我认为的每个现代系统上).当我想分配1 << 63给变量时,我得到一个编译器警告但是数字实际上是0.当我这样做时,1 << 30我得到了预期的结果2 ^ 30 = 1073741824.然而,当我这样做时1 << 31,我得到了2 ^ 64(我认为;实际上这不可能)打印的结果18446744071562067968.

任何人都可以向我解释这种行为吗?

P45*_*ent 12

1 << 63将在int算术中计算,你int的大概是32位.

通过推广其中一个论点来解决这个问题:1ULL << 63会做到这一点.

ULL 表示表达式至少为64位.

  • 这个答案是误导的。它说“通过提倡其中一种论点”,这似乎表明,提倡两种论点中的任何一种就足够了。实际上,移位运算符是*特殊的*,因为改变右操作数的类型不会导致左操作数的提升。在这种情况下,重要的是要特别更改左操作数的类型,而不是如该答案有误导性的那样更改“参数之一”。 (2认同)