我用Visual Studio,Ubuntu的GCC,Intel编译器MinGW测试了右移.所有转移的符号位.我猜
Xcode的GCC也是一样的.
我知道行为是具体的实现,但是看起来所有主要的桌面/服务器编译器都实现了算术移位.有没有任何广泛使用的编译器不会在符号位移动?
谢谢.
解决方法
C运行在很多不同的架构上.我的意思是很多不同的架构.您可以在嵌入式DSP和Cray超级计算机上运行C代码.
人们认为理所当然的C标准的大多数“实现定义”部分实际上只是在模糊的架构上打破了局面.例如,有DSP和Cray超级计算机,其中CHAR_BIT是一个巨大的32或64.所以如果你尝试在x86上的代码,也许如果你慷慨的PowerPC,ARM或SPARC,你不可能遇到任何真正奇怪的情况.没关系这些天的大多数代码将始终运行在具有二进制补码整数和算术移位的面向字节的架构上.毫无疑问,在可预见的未来,任何新的cpu架构都将是一样的.
但是让我们来看看整数的两个最常见的表示:二进制补码和补码:
switch ((-1) >> 1) { case 0: case -0: puts("Hello,one's complement world!"); // Possibly sign-magnitude. break; case -1: puts("Hello,two's complement world!"); break; default: puts("Hello,computer without arithmetic shift"); break; }
不要出汗只要坚持/当你想划分,>>当你需要转移即使是糟糕的编译器也很好的优化这些操作. (请记住,如果x是负数,x / 2!= x>> 1,除非你在一个补码机器上,这几乎肯定不是真的)
该标准确实保证if(int)x不为负,则(int)x>>> n ==(无符号)x>>> n,所以没有足够的空间让编译器做一些完全意外的事情.