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.