This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: shift+test optimization error
On 19/01/2017 09:03, leon zadorin wrote:
> Last time I checked in C, as well as in C++, standards -- shifting by
> the number of bits greater *or equal* to the size of the type is
> undefined behavior...
>
> e.g. something like "An expression is shifted by a negative number or
> by an amount greater than or equal to the width of the promoted
> expression (6.5.7)." from
> https://www.securecoding.cert.org/confluence/display/c/CC.+Undefined+Behavior#CC.UndefinedBehavior-ub_51
>
> The exact place in C++14 and or latest C standards escape me right
> now, but the thesis of this UB stands correct I think...
In C11, it's 6.5.7p3
http://port70.net/~nsz/c/c11/n1570.html#6.5.7p3
> 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.
C11: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf
C99: http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1256.pdf
http://port70.net/~nsz/c/c11/
http://port70.net/~nsz/c/c99/
> what is sizeof(long) on your target?
Sane 64-bit platforms define sizeof(long) to 8
Win64 defines sizeof(long) to 4 /troll
I think most (if not all) gcc ports define CHAR_BIT to 8.
Regards.