c++ - 是否有默认设置为 -1>>1 != -1 的 C99 编译器?

标签 c++ c c99 bit-shift c11

许多人在讨论右移运算符时经常指出,C 标准明确指出右移负数的效果是实现定义的。我可以理解该声明的历史基础,因为 C 编译器已用于为不使用二进制补码算法的各种平台生成代码。然而,我所知道的所有新产品开发都以处理器为中心,这些处理器不支持除二进制补码之外的任何类型的整数运算。

如果代码希望执行有符号整数除以 2 的幂,并且它只会在当前或 future 的体系结构中运行,那么 future 的编译器是否存在任何现实的危险将右移运算符解释为做任何其他事情?如果有现实的可能性,是否有任何好的方法可以在不对可读性、性能或两者产生不利影响的情况下提供它?是否有任何其他依赖项可以证明对运算符的行为进行完全假设(例如,代码在不支持函数 X 的实现上将无用,并且如果不使用符号扩展右移,则实现不太可能支持 X )?

注意:我在 C99 和 C11 标签下提问,因为我希望更新的语言特性会包含在其中,如果支持的话,这表明平台可能会使用右移,这在算术上等同于floored 除法,并且有兴趣了解以任何其他方式实现右移的任何 C99 或 C11 编译器。

最佳答案

这只是造成这种情况的众多原因之一,但请考虑信号处理情况:

1111 0001 >> 1
0000 1111 >> 1

以您所指的右移算法 (SRA) 的形式,您将获得以下内容:

1111 0001 >> 1 = 1111 1000
OR
-15 >> 1 = -8

0000 1111 >> 1 = 0000 0111
OR
15 >> 1 = 7

那么问题是什么?考虑一个幅度为 15 个“单位”的数字信号。将此信号除以 2 应该产生等效的行为,而不管符号如何。 但是,对于上述 SRA,15 的正信号将导致信号幅度为 7,而 15 的负信号将导致信号幅度为 8。这种不均匀性导致输出中出现直流偏置。出于这个原因,一些 DSP 处理器选择执行“四舍五入到 0”的右移算法,或完全采用其他方法。因为 C99 标准的措辞是原样,所以这些处理器仍然可以兼容。

在这些处理器上,-1 >> 1 == 0

Related Wiki

关于c++ - 是否有默认设置为 -1>>1 != -1 的 C99 编译器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20103152/

相关文章:

将 uint8_t 数组复制到结构

做指针事情时的 Const 类型限定符

c - 为什么很少有符合C99的编译器?

c++ - 使用 std::chrono::steady_clock 对线程/异步中的代码进行基准测试

c++ - 打印包含 multimap 的双端队列

c++ - 整齐地约束 API 模板类型

检查c数组中添加了多少项?

c - malloc 防止垃圾被打印?

c - 变量改变的位置?

c++ - SFINAE 用于回调注册