Left shifting with a negative shift count

匿名 (未验证) 提交于 2019-12-03 01:58:03

问题:

What exactly happens here?

a

Obviously it doesn't right shift. But the book I'm reading states:

On one machine, this expression actually does a left shift of 27 bits

My question is; why? What causes a left shift of 27 bits? And what exactly happens when shifting with a negative shift count? Thank you.

回答1:

Negative integers on right-hand side is undefined behavior in the C language.

ISO 9899:1999 6.5.7 Bit-wise shift operators §3

The integer promotions are performed on each of the operands. The type of the result is that of the promoted left operand. If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined.



回答2:

As already answered by other members, it produces undefined behavior. What I would like to mention here is that you quote from the book ( "On one machine" ) seems to be partial. It does not generalize the behavior. The book might also have explained that the behavior is undefined as per the standard. BTW, I was just going through "The New C Standard - An Economic and Cultural Commentary" and found this statement :

The Intel Pentium SAL instruction (generated by both gcc and Microsoft C++ to evaluate left-shifts) only uses the bottom five bits of the shift amount

This very well explains why a left shift of -5 could result into a left shift of 27 ( for 2's complement representation of negative numbers )



回答3:

The behaviour is undefined.

In 5-bit binary arithmetic, two's-complement -5 has the same binary representation as unsigned +27, which probably explains that particular platform.



回答4:

If the value you're shifting is a 32 bit variable, shifting -5 goes in a "loop" and shifts 27 forward. Shifting can only take place in a "unsigned" fashion.



回答5:

int main() {     unsigned int a = 1;     printf("%u\n",a

The output is 2147483648.

Here is my assumption and validation:(just assumption!)

1.The "

so firstly, the (int) “-1” will be cast into (unsigned int) "-1". Cause int type is two's-complement representation, the result will be 2^32-1(unsigned int)

2.Due to number 2^32-1 is larger than the Max displacement digit, 2^32 - 1 will be mod 32, which equals 27

I also tried some other nagetive right operand numbers, and the manual calculation results with assumpted rules will be the same with what product by my IDE.

I am trying to find some supporting offical documents, witch could verificate whether my assumption is right or not. Maybe you can tell me.



标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!