微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

原文地址:https://www.jb51.cc/c/112165.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐