Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does the C standard say about bitshifting more bits than the width of type?

Tags:

c

bit-shift

Consider the following code:

int i = 3 << 65;

I would expect that the result is i==0, however the actual result is i==6. With some testing I found that with the following code:

int i, s;
int a = i << s;
int b = i << (s & 31);

the values of a and b are always the same.

Does the C standard say anything about shifting more than 32 bits (the width of type int) or is this unspecified behavior?

like image 739
bcmpinc Avatar asked Jun 30 '12 00:06

bcmpinc


People also ask

Is bit operation faster?

On simple low-cost processors, typically, bitwise operations are substantially faster than division, several times faster than multiplication, and sometimes significantly faster than addition.

What does shift right do?

The right-shift operator causes the bit pattern in shift-expression to be shifted to the right by the number of positions specified by additive-expression . For unsigned numbers, the bit positions that have been vacated by the shift operation are zero-filled.

What is right shift and left shift operator?

The bitwise shift operators move the bit values of a binary object. The left operand specifies the value to be shifted. The right operand specifies the number of positions that the bits in the value are to be shifted.


1 Answers

From my WG12/N1124 draft (not the standard, but Good Enough For Me), there's the following block in 6.5.7 Bitwise shift operators:

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.

So, undefined. Be careful.

like image 89
sarnold Avatar answered Oct 17 '22 08:10

sarnold