简单的代码段:
#define FOO 7
int bar = -875;
bar <<= FOO;
UBSAN将其报告为UB。
我的理解是
-875 << 7
只是-(875<<7)
而且没有溢出。
那么,这里真的有问题吗?
最佳答案
您的理解不正确。
首先,您使用了bar <<= FOO
语法。这将显式移动bar
且bar
为负。负值向左移动会在C语言中产生未定义的行为。bar <<= FOO
不能解释为-(875<<7)
。
其次,关于-875 << 7
的运算符优先级:一元运算符的优先级始终高于二进制运算符,这意味着-875 << 7
是(-875) << 7
而不是-(875 << 7)
。同样,负值向左移动会在C语言中产生不确定的行为。
关于c - UBSAN报告:-875 << 7为未定义行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36751538/