Re: Why does left shift operation invoke Undefined Behaviour when the left side operand has negative value?
On 25 Sep., 08:43, Prasoon Saurav <prasoonsaurav....@gmail.com> wrote:
In C bitwise left shift operation invokes Undefined Behaviour when the
left side operand has negative value.
Relevant quote from ISO C99 (6.5.7/4)
"The result of E1 << E2 is E1 left-shifted E2 bit positions; vacated
bits are ???lled with zeros. If E1 has an unsigned type, the value of
the result is E1?? 2E2, reduced modulo one more than the maximum value
representable in the result type. If E1 has a signed type and
nonnegative value, and E1?? 2E2 is representable in the result type,
then that is the resulting value; otherwise, the behavior is
unde???ned."
But in C++ the behaviour is well defined.
ISO C++-03 (5.8/2)
"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. [Note: the constants
ULONG_MAXand UINT_MAXare defined in the header ). ] "
That means
int a cinvokes Undefined Behaviour in C but the behaviour is well defined in C
++.
What forced the ISO C++ committee to consider that behaviour well
defined as opposed to the behaviour in C?
On the other hand the behaviour is implementation defined for bitwise
right shift operation when the left operand is negative, right?
My question is why does left shift operation invoke Undefined
Behaviour in C and why does right shift operator invoke just
Implementation defined behaviour?
I'm not sure what the original reason was, but
in C++0x the wording has been changed and been
synchronized with that of C99 as the result of
the core issue
http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_defects.html#854
As of 5.8/2 in the recent working draft:
"The value of E1 << E2 is E1 left-shifted E2 bit positions;
vacated bits are zero-filled. If E1 has an unsigned
type, the value of the result is E1 ?? 2E2, reduced modulo
one more than the maximum value representable in the result
type. Otherwise, if E1 has a signed type and non-negative
value, and E1??2E2 is representable in the result type, then
that is the resulting value; otherwise, the behavior is
undefined."
HTH & Greetings from Bremen,
Daniel Kr??gler
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]