Message270827
About shifts, according to C standard, right shifts >> of negative numbers are implementation-defined:
"[in E1 >> E2], If E1 has a signed type and a negative value, the
resulting value is implementation-defined."
In K&R this meant that the number can be either zero-extended or sign-extended. In any case it cannot lead to undefined behaviour, but the implementation must document what is happening there. Now, GCC says that >> is always arithmetic/sign-extended. This is the implementation-defined behaviour, now GCC has defined what its implementation will do, but some implementation can choose zero-extension. (unlikely)
As for the other part as it says "GCC does not use the latitude given in C99 only to treat certain aspects of signed ‘<<’ as undefined". But GCC6 will diagnose that now with -Wextra, and thus it changed already, as with -Werror -Wextra the code doesn't necessarily compile any longer, which is fine. Note that this "certain -- only" refers to that section where the C99 and C11 explicitly say that the behaviour is undefined and C89 doesn't say anything. It could as well be argued that in C89 it is undefined by omission.
Additionally all shifts that shift by more than or equal to the width *still* have undefined behaviour (as do shifts by negative amount). IIRC they work differently on ARM vs x86: in x86 the shift can be mod 32 on 386, and in ARM, mod 256. |
|
Date |
User |
Action |
Args |
2016-07-19 14:06:40 | ztane | set | recipients:
+ ztane, gvanrossum, loewis, nnorwitz, gregory.p.smith, jcea, mark.dickinson, pitrou, vstinner, christian.heimes, alexandre.vassalotti, donmez, matejcik, jwilk, alex, dmalcolm, python-dev, deadshort, martin.panter, serhiy.storchaka, fweimer, Jeffrey.Walton |
2016-07-19 14:06:40 | ztane | set | messageid: <1468937200.88.0.141188278801.issue1621@psf.upfronthosting.co.za> |
2016-07-19 14:06:40 | ztane | link | issue1621 messages |
2016-07-19 14:06:40 | ztane | create | |
|