开发者

Applying bitwise shift operators to signed types: UB and Impl. defined

开发者 https://www.devze.com 2023-03-15 15:14 出处:网络
C++03 standard tells us that the result of applying the bitwise shift operators to signed types can be UB and Impl. defined for ne开发者_JAVA技巧gative values. My question is following: why for operat

C++03 standard tells us that the result of applying the bitwise shift operators to signed types can be UB and Impl. defined for ne开发者_JAVA技巧gative values. My question is following: why for operator << it has undefined behaviour, while for operator >> it is just implementation defined ? Is there a strict reason why the result of << couldn't be implementation defined also ?

Thanks in advance.


According to 5.8/2 (admittedly in C++ 98 which is all I have access to):

The value of E1 << E2 is E1 (interpreted as a bit pattern) left shifted E2 bit positions; vacated bits are zero filled. If E1 has an unsigned type, the value of the result is E1 multiplied by the quantity 2 raised to the power E2, reduced modulo ULONG_MAX+1 if E1 has type unsigned long, UINT_MAX+1 otherwise.

From this it looks to me like it's perfectly well defined for left shift. What's not defined is the representation of signed values (such as twos-complement) used so the numeric value of the result is implementation defined for negative values.

This is in contrast to right-shifting where the vacated bits may be zero or one filled depending on the representation of signed values.

0

精彩评论

暂无评论...
验证码 换一张
取 消