On 12/04/2014 03:50 PM, Peter Corlett wrote:
On Tue, Dec 02, 2014 at 03:32:38PM -0800, Fred Cisin
wrote:
. . .
>>> long long int A;
>>> int B;
>>> A = B << 32;
[...]
So, should the compiler optimize that to
MOV X,0
or
NOP
?
That basically depends on what "long long" and "int" means
:)
The C99 (draft) standard says of << and >> that "[t]he behavior is
undefined if
the right operand is negative, or greater than or equal to the length in bits
of the promoted left operand"
Well, that's the problem! The destination
was 64 bits, the
operand was 32 bits.
if the 32-bit operand got promoted to 64-bits, it would have
worked as the
original programmer intended. But, the whole operation was
done at 32 bits,
and the desired bits fell off the end. I thought that C did
NOT promote smaller
operands, so the behavior was actually expected, once I saw
what was really
going on there.
Jon