我知道行为是具体的实现,但是看起来所有主要的桌面/服务器编译器都实现了算术移位.有没有任何广泛使用的编译器不会在符号位移动?
谢谢.
解决方法 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 – 签名右移:哪个编译器使用逻辑移位全部内容,希望文章能够帮你解决c – 签名右移:哪个编译器使用逻辑移位所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)