disabling unary "-" for unsigned types
Lars T. Kyllingstad
public at kyllingen.NOSPAMnet
Tue Feb 16 02:00:16 PST 2010
Steven Schveighoffer wrote:
> On Mon, 15 Feb 2010 17:21:09 -0500, Walter Bright
> <newshound1 at digitalmars.com> wrote:
>
>> Steven Schveighoffer wrote:
>>> are there any good cases besides this that Walter has? And even if
>>> there are, we are not talking about silently mis-interpreting it.
>>> There is precedent for making valid C code an error because it is
>>> error prone.
>>
>>
>> Here's where I'm coming from with this. The problem is that CPU
>> integers are 2's complement and a fixed number of bits. We'd like to
>> pretend they work just like whole numbers we learned about in 2nd
>> grade arithmetic. But they don't, and we can't fix it so they do. I
>> think it's ultimately fruitless to try and make them behave other than
>> what they are: 2's complement fixed arrays of bits.
>>
>> So, we wind up with oddities like overflow, wrap-around,
>> -int.min==int.min. Heck, we *rely* on these oddities (subtraction
>> depends on wrap-around). Sometimes, we pretend these bit values are
>> signed, sometimes unsigned, and we mix together those notions in the
>> same expression.
>
> One further thing I'll say on this:
>
> signed computer math makes a lot of sense to people because the limits
> are so large. For instance, -2 billion to 2 billion. It seems logical
> that a computer can't just keep coming up with new bits to represent
> numbers, but it seems so far off that an integer will wrap at 2
> billion. But unsigned math has a much more familiar boundary -- zero.
> Numbers are far more likely to be near zero than they are near 2 billion
> or -2 billion. Applying a negation operator to an unsigned value almost
> *guarantees* wrapping past that boundary. 99% of the time, when I apply
> a negative sign to a number, I want the negative equivalent of that
> number. I don't want some large bizarre value that has no relation to
> that number, despite what the computer thinks is sane. I'd look at
> applying a negation operator to an unsigned int with as much scrutiny as
> I'd look at multiplying an integer by 1_000_000_000. It's almost
> guaranteed to go out of bounds, why are you doing it?
>
> Bringing up -int.min == int.min is exactly my point. For integers,
> there is one value that the negation operator doesn't work as expected.
> For unsigned integers, there is only one number that *does* work as
> expected -- zero. All others either don't work as expected, or rely on
> the computer behaving strangely (if it is indeed expected). To make
> such rare purposeful uses more explicit does not lower the quality of
> code or the ease of use.
Well said.
-Lars
More information about the Digitalmars-d
mailing list