Treating the abusive unsigned syndrome
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Thu Nov 27 06:27:01 PST 2008
Don wrote:
> Andrei Alexandrescu wrote:
>> One fear of mine is the reaction of throwing of hands in the air "how
>> many integral types are enough???". However, if we're to judge by the
>> addition of long long and a slew of typedefs to C99 and C++0x, the
>> answer is "plenty". I'd be interested in gaging how people feel about
>> adding two (bits64, bits32) or even four (bits64, bits32, bits16, and
>> bits8) types as basic types. They'd be bitbags with undecided sign
>> ready to be converted to their counterparts of decided sign.
>
> Here I think we have a fundamental disagreement: what is an 'unsigned
> int'? There are two disparate ideas:
>
> (A) You think that it is an approximation to a natural number, ie, a
> 'positive int'.
> (B) I think that it is a 'number with NO sign'; that is, the sign
> depends on context. It may, for example, be part of a larger number.
> Thus, I largely agree with the C behaviour -- once you have an unsigned
> in a calculation, it's up to the programmer to provide an interpretation.
>
> Unfortunately, the two concepts are mashed together in C-family
> languages. (B) is the concept supported by the language typing rules,
> but usage of (A) is widespread in practice.
In fact we are in agreement. C tries to make it usable as both, and
partially succeeds by having very lax conversions in all directions.
This leads to the occasional puzzling behaviors. I do *want* uint to be
an approximation of a natural number, while acknowledging that today it
isn't much of that.
> If we were going to introduce a slew of new types, I'd want them to be
> for 'positive int'/'natural int', 'positive byte', etc.
>
> Natural int can always be implicitly converted to either int or uint,
> with perfect safety. No other conversions are possible without a cast.
> Non-negative literals and manifest constants are naturals.
>
> The rules are:
> 1. Anything involving unsigned is unsigned, (same as C).
> 2. Else if it contains an integer, it is an integer.
> 3. (Now we know all quantities are natural):
> If it contains a subtraction, it is an integer [Probably allow
> subtraction of compile-time quantities to remain natural, if the values
> stay in range; flag an error if an overflow occurs].
> 4. Else it is a natural.
>
>
> The reason I think literals and manifest constants are so important is
> that they are a significant fraction of the natural numbers in a program.
>
> [Just before posting I've discovered that other people have posted some
> similar ideas].
That sounds encouraging. One problem is that your approach leaves the
unsigned mess as it is, so although natural types are a nice addition,
they don't bring a complete solution to the table.
Andrei
More information about the Digitalmars-d
mailing list