表达式中意外的整数溢出
Unexpected integer overflow in expression
我正在尝试得到一个 unsigned
将完全用 1 填充(二进制表示将是 32 个 1。我尝试使用这个:
constexpr unsigned all_ones = (((1 << 31) - 1) << 1) | 1;
但是在编译时(Ubuntu 上的 g++)它给出了以下错误:
error: overflow in constant expression [-fpermissive]
导致此错误的原因是什么?对我来说,这个表达式看起来不错,如下所示:
1 = 000...001
<< 31 = 100...000
- 1 = 011...111
<< 1 = 111...110
| 1 = 111...111
我知道我可以通过其他方式(比如~0u)得到需要的值,但我想问的是为什么这个方法不行。
您的表达式正在使用带符号的整数常量并且确实溢出到符号位(这会使您进入未定义的行为)。您可以通过指定无符号常量来避免错误:
constexpr unsigned all_ones = (((1U << 31) - 1) << 1) | 1;
但是表达还是过于复杂,最好表达为:
constexpr unsigned all_ones = ~0U;
我会尝试使用 header 限制中的定义,这就是它们的用途,您基本上是在要求无符号整数可以表示的最大值。
constexpr unsigned all_ones = UINT_MAX;
我正在尝试得到一个 unsigned
将完全用 1 填充(二进制表示将是 32 个 1。我尝试使用这个:
constexpr unsigned all_ones = (((1 << 31) - 1) << 1) | 1;
但是在编译时(Ubuntu 上的 g++)它给出了以下错误:
error: overflow in constant expression [-fpermissive]
导致此错误的原因是什么?对我来说,这个表达式看起来不错,如下所示:
1 = 000...001
<< 31 = 100...000
- 1 = 011...111
<< 1 = 111...110
| 1 = 111...111
我知道我可以通过其他方式(比如~0u)得到需要的值,但我想问的是为什么这个方法不行。
您的表达式正在使用带符号的整数常量并且确实溢出到符号位(这会使您进入未定义的行为)。您可以通过指定无符号常量来避免错误:
constexpr unsigned all_ones = (((1U << 31) - 1) << 1) | 1;
但是表达还是过于复杂,最好表达为:
constexpr unsigned all_ones = ~0U;
我会尝试使用 header 限制中的定义,这就是它们的用途,您基本上是在要求无符号整数可以表示的最大值。
constexpr unsigned all_ones = UINT_MAX;