I just checked the C++ standard. It seems the following code should NOT be undefined behavior:
unsigned int val = 0x0FFFFFFF;
unsigned int res = val >> 34; // res should be 0 by C++ standard,
// but GCC gives warning and res is 67108863
And from the standard:
The value of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a non-negative value, the value of the result is the integral part of the quotient of E1/2^E2. If E1 has a signed type and a negative value, the resulting value is implementation-defined.
According to the standard, since 34 is NOT an negative number, the variable res
will be 0.
GCC gives the following warning for the code snippet, and res
is 67108863
:
warning: right shift count >= width of type
I also checked the assembly code emitted by GCC. It just calls SHRL
, and the Intel instruction document for SHRL, the res
is not ZERO.
So does that mean GCC doesn't implement the standard behavior on Intel platform?