c – 签名右移:哪个编译器使用逻辑移位

我用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,所以没有足够的空间让编译器做一些完全意外的事情.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...