Subject: Re: Documentation of abs(3), div(3) etc.
To: None <tech-misc@netbsd.org>
From: Martijn van Buul <pino@dohd.org>
List: tech-misc
Date: 02/09/2007 18:48:34
* Alan Barrett:
> On Wed, 07 Feb 2007, Martijn van Buul wrote:
>> * Christian Biere:
>> > This is a lie anyway because the code looks like
>> >
>> > 	return a < 0 ? -a : a;
>> >
>> > whereas it obviously means
>> >
>> > 	return a < 0 ? -(unsigned)a : a;
>> 
>> This is plain nonsense, on multiple grounds. First of all, you're casting
>> a signed int (known to be negative) to an unsiged int, which is pretty
>> broken to begin with, secondly, you're trying to negate the resulting
>> unsigned number, which isn't any better.
>
> The suggested replacement code is correct. 

It is not. It is nonsensical, in that it is in effect the same as the
supposedly "broken" code.

> Unsigned arithmetic in C is defined in terms of modular arithmetic in
> mathematics.

My point was that the proposed change indicates is pointless, doesn't
change a single opcode, and obviously indicates a lack of understanding.

If you really think that

signed int a;
return (signed int) ( - (unsigned)a );

is in any better than

signed int a;
return -a;

then I kindly suggest you catch up with how C works.

> The original code would invoke undefined behaviour if it appeared in
> user-written code.

And what, pray tell, is the difference between this code appearing in
user-written code and this code appearing in a userland library? It's just
as broken, and just as undefined.  It's just that the standard explicitly
allows undefined behaviour, but there's no reason user-written code can't 
have the same definition.

> (The mathematical result of -a might be outside the range representable by a
> signed int, which gives undefined bahaviour.)

Yes, you're repeating what I said before. A simple cast will *not* fix this.

-- 
Martijn van Buul - pino@dohd.org