对整数使用负数进行左移或右移操作是否属于定义行为?
整数使用负数进行移位操作的行为定义
- 核心结论:在C++标准中,使用负数作为左移(
<<)或右移(>>)操作的右操作数,属于未定义行为。
未定义行为意味着C++标准不对这种情况的结果做任何保证,编译器可自由处理——可能像你代码里那样输出0,可能程序崩溃,可能输出随机值,甚至触发其他异常行为,完全取决于编译器的实现逻辑。
你代码里得到的0只是当前编译器的一种处理方式,换个编译器、版本或者编译选项,结果很可能不一样,绝对不能依赖这个输出。
根据C++标准要求,移位操作的右操作数必须满足两个条件:
- 必须是非负整数;
- 数值必须小于被移位变量的类型位数(比如
int通常是32位,右操作数要在0到31之间)。
你的代码中a << -1和x >> -1都违反了这个规则,所以结果完全不可预期。
内容的提问来源于stack exchange,提问作者Guru Jadhav
相关产品推荐
相关产品推荐

