将按位移位运算符应用于有符号类型:UB 和 Impl。定义的

发布于 2024-11-17 10:44:05 字数 246 浏览 1 评论 0原文

C++03标准告诉我们,将按位移位运算符应用于有符号类型的结果可以是UB和Impl。定义为值。我的问题如下:为什么对于运算符<<它有未定义的行为,而对于运算符>>它只是 > 实现定义 ? << 的结果不能也被实现定义是否有严格的原因?
提前致谢。

C++03 standard tells us that the result of applying the bitwise shift operators to signed types can be UB and Impl. defined for negative values. My question is following: why for operator << it has undefined behaviour, while for operator >> it is just implementation defined ? Is there a strict reason why the result of << couldn't be implementation defined also ?
Thanks in advance.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

咆哮 2024-11-24 10:44:05

根据 5.8/2(诚然,在 C++ 98 中,这是我可以访问的所有内容):

E1的值<< E2是E1
(解释为位模式)
左移 E2 位位置;腾出
位被零填充。如果E1有一个
无符号类型,结果的值
是 E1 乘以数量 2
求 E2 次幂,约模
如果 E1 的类型为无符号,则 ULONG_MAX+1
长,否则 UINT_MAX+1。

从这里看来,在我看来,它对于左移来说是完美定义的。未定义的是所使用的有符号值(例如二进制补码)的表示形式,因此结果的数字是为负值定义的实现。

这与右移相反,右移根据有符号值的表示,空出的位可能为零或被填充。

According to 5.8/2 (admittedly in C++ 98 which is all I have access to):

The value of E1 << E2 is E1
(interpreted as a bit pattern)
left shifted E2 bit positions; vacated
bits are zero filled. If E1 has an
unsigned type, the value of the result
is E1 multiplied by the quantity 2
raised to the power E2, reduced modulo
ULONG_MAX+1 if E1 has type unsigned
long, UINT_MAX+1 otherwise.

From this it looks to me like it's perfectly well defined for left shift. What's not defined is the representation of signed values (such as twos-complement) used so the numeric value of the result is implementation defined for negative values.

This is in contrast to right-shifting where the vacated bits may be zero or one filled depending on the representation of signed values.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文