On Fri, 28 Jun 2013, Andrew Haley wrote:
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.
Implementation defined, and ok with gcc:
http://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html
--
Marc Glisse