以前一直有个误区,认为负整数的右移位操作符不会改变变量值,但最近查阅文档发现,其实这只是VC编译器的行为,而这种行为并不是ISO文档里规定死的,因此,做个小结。
这部分内容在C99文档的6.5.7能找到。
移位之前首先做的是整形提升。<<操作符不用说了,右侧补0。>>操作符,这个有点意思,结果取决于左侧是什么值,如果是个unsigned的,那没关系,正常操作,如果是个signed,存了个正数,也没关系,但如果是个负数,那就没准了,如何实现完全看编译器,在VC里是无效操作,我试了下GCC,也是一样,暂且理解成一种不成文的规定吧。
另外,其实signed的负数做左移也是undefined,编译器甚至不需要支持这种操作,但在VC中是符号位保持不动,其他位右侧补0,是不是也能看成是个不成文的规定?