> On Tue, 29 Nov 2011 17:39:12 +0000, Ben Bacarisse wrote:
> Ian Collins <ian-> writes: <snip>
>> [...] I believe sifting a signed integer and this the code is
>> undefined.
>
> That's a good shorthand, since it will encourage the use of unsigned
> ints wherever possible, but it is not true as you have stated it. 1<<4
> is a shift of a signed int and is well-defined. The exact rules can be
> found in the C standard (search for n1256.pdf) or in any good C text,
> but it's better to forget them! Use unsigned ints for bit operations.
I have H&s5 here. Section 7.6.3 states "Applying the shift operator >> is
not portable when the left operand is negative, signed value and the
right operand is nonzero"
What I noticed are two things:
(1) My examlpes uses << rather than >>. Hence above rule does not apply
(2) H&S5 is using word "and" rather than word "or", which directly means
all three conditions in "negative, signed value and right operand is
zero" must be satisfied.
n1256.pdf in Section 6.5.7 (4) states:
"The result of E1 << E2 is E1 left shifted E2 but positions; vacated
bits are filled with zeroes. If E1 has unsigned type, the result is
E1x2^E2, reduced modulo one more than the maximum value representable in
the result type. If E1 has a signed type and nonnegative value, and
E1x2^E2 is representable in the result type, then that is resulting
value; otherwise , the behavior is undefined"
It is proved that this interview code has undefined behavior.
(unfortunately it was a MCQ (Multiple Choice Question) and undefined
behavior was not one of the options).
> The OP's code:
>
> printf("%x\n", -1<<4);
>
> is probably undefined for two reasons (the other being the technical
> detail that %x expects an unsigned int argument) and writing
hey.. I did not know this %x secret
> printf("%x\n", (unsigned)-1<<4);
>
> would have fixed both. Who sets these interview questions?
Yes, that casting fixes as per standard says. Thanks for that. Regarding
interview questions, once I was asked the value of i after this operation:
i = i++;
I said its UB but the guy did not like my answer.
--
arnuld
http://LispMachine.Wordpress.com