【发布时间】:2011-09-23 04:39:50
【问题描述】:
我使用 Visual Studio、Ubuntu 的 GCC、Intel 编译器、MinGW 测试了右移。全部移位符号位。我猜 Xcode 的 GCC 也是如此。
我知道该行为是特定于实现的,但看起来所有主要的桌面/服务器编译器都实现了算术移位。是否有任何广泛使用的编译器不会改变符号位?
谢谢。
【问题讨论】:
-
实现定义的行为正是由实现定义的。位移位用于将值视为位的集合。有符号数并不意味着被视为位的集合。使用无符号值。或者如果你想除以二,然后除以二 - 不要使用移位。如果该优化有效,编译器将为您完成。另见securecoding.cert.org/confluence/display/cplusplus/…
-
等等,你是说在 C++ 中右移一个无符号值是标准未定义的?!不知道...
-
问题是除以 2 的行为与算术右移不同。因此,如果您使用除法,编译器无法将其更改为移位,并且如果您想要带符号的移位行为,则在 C 中没有简单、可移植的方式来表达它
-
@Mehrdad:这是实现定义的 signed 值的右移...无符号值很好。 @ pic11:顺便说一句-不仅仅是符号位是否“移入”,还在于新的 m.s.b.是 0 或 1(当然,对于实现定义的行为,可能会出现一些异常情况,结果不是上述情况:-/)。
-
你最好不要不知道也不关心。这样一来,您就不会意外编写不可移植的代码。
标签: c++ c bit-shift implementation-defined-behavior