uint is NOT just a positive number

Jeremie Pelletier jeremiep at gmail.com
Wed Oct 7 09:10:04 PDT 2009


Don wrote:
> Kagamin wrote:
>> Some people used to use unsigned integers as 'mere' non-negative 
>> numbers, but they're actually not numbers from range, they're numbers 
>> from entirely different algebra. And - yes - this causes subtle bugs. 
> 
> Amen!
> I actually think it's worse in D, because 'uint' is so easy to type, 
> it's far more seductive than 'unsigned int'.
> 
> Recent introduction of integer range promotions works hard in hiding 
> those bugs, so they manifest only in very rare corner cases.
> 
> It's not complete. It doesn't apply to arithmetic operations yet. Once 
> that's in place, D could become really harsh about mixing signed and 
> unsigned: if there's any chance the highest bit is set in the signed 
> type, mixing signed and unsigned should be illegal.
> 
>> Ever wondered wheter a-=b and a+=-b equivalent? In most cases they 
>> are, except for one. Do you remember? uint is not propagated to long. 
>> I've hit it recently. It's exactly because unsigneds are not just 
>> non-negative numbers. So it's pain to see their wide use as numbers 
>> for which sign-sensitive arithmetic operations are meaningful.

I think it also depend on the representation of that number, for example 
most numbers I would feel more natural as hex value such bit fields and 
flags, address offsets, and whatnot are all unsigned, almost everything 
else is signed.

I did get annoyed about uint not automatically propagated to long 
however, when I was reading lo/hi uint offset pairs from a file and 
making it a long offset (lo + (hi<<32)), turns out it can't be done 
without explicit long casts.



More information about the Digitalmars-d mailing list