【发布时间】:2015-10-01 22:53:32
【问题描述】:
我有一个简单的程序,其中有一些用于位操作的宏。
其中一个宏转换为跟随
unsigned long val = 1 << 0x1f;
在这里,我得到的输出是 `
val = 0xffffffff80000000;
我知道这是某种 int 溢出。我对最终结果的部分感到困惑。为什么结果是我得到的结果?
(出于某种原因,我确实在这里理解 1 被视为 int 并且当左移使其成为负 int 时。但是我对类型转换感到困惑的部分。)
【问题讨论】:
-
你可能想用
1L << 0x1f把它变成一个长的。 -
是的,这行得通。当赋值为 long 时,编译器无法理解它,这有点难过。
-
@Jester:这仍然是未定义的行为,因为转移到了符号位。实际上,它必须是一个无符号整数:
1LU. -
@Olaf 他显然在使用
long是64 位的系统,因为31 的移位不是符号位,所以它不是未定义的。但是,是的,因为预期的类型是unsigned long,所以最好使用UL。 -
@Jester:抱歉,这是指 OPs 版本。但是,使用无符号是可移植的方式。永远不要依赖基本类型的宽度(如果需要固定宽度类型,请使用
stdint.h类型)。
标签: c