On 06/28/2013 08:53 AM, Shiva Chen wrote:
> I have a case which will generate abs instructions.
>
> int main(int argc)
> {
> if (argc < 0)
> argc = -(unsigned int)argc;
> return argc;
> }
>
> To my understanding, given that argc=0x80000000 in 32bit int plaform,
> the result of (unsigned int)argc is well defined and should be 0x80000000u.
> (C99 6.3.1.3 point 2)
>
> And then the result of -0x80000000u should be 0x80000000 because
> unsigned operation can never overflow and the value can be
> represented by signed integer.
> (C99 6.2.5 point 9)
Yes, but you can't then assign that to an int, because it will overflow.
0x80000000 will not fit in an int: it's undefined behaviour.
Andrew.