C++ 是否有任何C99编译器的默认设置为-1>&燃气轮机;1 != -1.
许多人在讨论右移运算符时经常指出,C标准明确规定,负数右移的效果由实现定义。我可以理解这种说法的历史依据,因为C编译器已经被用于为各种不使用二补运算的平台生成代码。然而,据我所知,所有的新产品开发都是围绕着处理器展开的,这些处理器除了2的补码外,对任何类型的整数运算都没有内在的支持 如果代码希望执行二次幂的有符号整数除法,并且只在当前或未来的体系结构中运行,那么未来的编译器是否会将右移位运算符解释为执行其他操作?如果有现实的可能性,是否有好的方法来提供它而不影响可读性、性能或两者?是否有任何其他依赖项可以证明对操作员行为的完全假设是合理的(例如,代码在不支持函数X的实现上是无用的,如果不使用符号扩展右移,则实现不可能支持X)C++ 是否有任何C99编译器的默认设置为-1>&燃气轮机;1 != -1.,c++,c,c99,bit-shift,c11,C++,C,C99,Bit Shift,C11,许多人在讨论右移运算符时经常指出,C标准明确规定,负数右移的效果由实现定义。我可以理解这种说法的历史依据,因为C编译器已经被用于为各种不使用二补运算的平台生成代码。然而,据我所知,所有的新产品开发都是围绕着处理器展开的,这些处理器除了2的补码外,对任何类型的整数运算都没有内在的支持 如果代码希望执行二次幂的有符号整数除法,并且只在当前或未来的体系结构中运行,那么未来的编译器是否会将右移位运算符解释为执行其他操作?如果有现实的可能性,是否有好的方法来提供它而不影响可读性、性能或两者?是否有任何其他
注意:我在C99和C11标签下询问,因为我预计更新的语言功能将在其中,如果支持,将表明平台可能会使用右移,这在算术上相当于地板除法,并且对任何其他实现右移位的C99或C11编译器都很感兴趣。 < P>这只是其中的一个原因,但是请考虑信号处理的情况:
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
理论上,现在编译器实现中存在一些微妙之处,这些细微之处可能会滥用所谓的“未定义行为”,超出后端cpu对寄存器(或“文件”或内存位置或其他位置)上实际整数的处理范围: