这里到底发生了什么?

a << -5

显然,它不正确地移动。但是我正在读的书说:


  在一台机器上,该表达式实际上向左移27位


我的问题是;为什么?是什么导致左移27位?当换挡计数为负时,到底发生了什么?谢谢。

最佳答案

右侧的负整数是C语言中未定义的行为。

ISO 9899:2011 6.5.7按位移位运算符:


  对每个操作数执行整数提升。结果的类型是提升后的左操作数的类型。如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为是不确定的。

08-27 12:06