disabling unary "-" for unsigned types

Ellery Newcomer ellery-newcomer at utulsa.edu
Mon Feb 15 21:35:21 PST 2010


On 02/15/2010 09:17 PM, Steven Schveighoffer wrote:
> On Mon, 15 Feb 2010 21:32:21 -0500, Rainer Deyke <rainerd at eldwood.com>
> wrote:
>
>> Ellery Newcomer wrote:
>>> On 02/15/2010 05:33 PM, Steven Schveighoffer wrote:
>>>> uint a = -1; // error
>>>
>>> I can't say I would appreciate having to write
>>>
>>> uint a = 0xFFFFFFFF;
>>>
>>> or the equivalent for ulong.
>>
>> uint a = ~0u;
>
> even ~0 works, no need for the u (although it makes things clearer).
>
> Ellery, you didn't read my original post thoroughly, I said this was the
> most common case of wanting to use unary negative on an unsigned value,
> and it's easily rewritten, with the same number of characters no less.
>
> -Steve

Ohhh! that post! You're right; I missed that part.

Alright, here's something I found myself writing just today or yesterday:

//x,r are long, n is ulong

if(x < 0){
   ulong ux = -x;
   ...
}

I also have

if(r < 0){
   return n - (-r) % n;
}

emphasis on ensuring dividend is positive before it gets promoted to 
ulong, etc etc, and I do guard that r is not remotely close to 
ulong.max/min.

assuming that the return type is long (it isn't, but it might as well 
be, since n is always within [2,long.max]) or gets assigned to long or 
whatever.

-The bottom one obeys your rules.
-The top one doesn't.
-The bottom one is much less clear than the top.
-Whatever I was trying to prove, I think I just inadvertently 
strengthened your argument tenfold.

and no, I expect this doesn't fall within the 99% use case of unary -



More information about the Digitalmars-d mailing list