Mixing operations with signed and unsigned types

Stewart Gordon smjg_1998 at yahoo.com
Thu Jul 1 17:52:43 PDT 2010


bearophile wrote:
<snip>
> Yes, in my opinion it needs to be fixed.  Using unsigned integers 
> in D is a hazard, so if you use them where they are not necessary 
> (and representing positive-only values is often not one of such 
> cases) then you are doing something wrong,

If it's logical and the program works, it isn't objectively wrong.  Some 
of us prefer to use unsigned types where the value is semantically 
unsigned, and know what we're doing.  So any measures to stronghold 
programmers against using them are going to be a nuisance.

I can also imagine promoting your mindset leading to edit wars between 
developers declaring an int and then putting
     assert (qwert >= 0);
in the class invariant, and those who see this and think it's brain-damaged.

<snip>
> Using size_t and uint in your code where you can use an int is 
> something that needs to be fixed, in my opinion.  Normal D 
> programmers writing very mundane code must not be forced to face 
> unsigned values every few lines of code.

True, but that doesn't mean that we should force programmers to use 
signed values for nearly everything.

But it is all the more reason to fix unsigned op signed to be signed, if 
it is to be allowed at all.  The way it is at the moment, a single 
unsigned value in a formula can force the whole result to be unsigned, 
thereby leading to unexpected results.

> Unsigned values in D are quite bug-prone, so the language has to
> avoid putting them on your plate every time you want to write some
> code.  You need to be free to use them when you want, but it's better
> for you to use them only when necessary.

You could make a similar argument the same about integer types 
generally.  People coming from BASIC backgrounds, or new to programming 
generally, are sooner or later going to have some work to do when they 
find that 1/4 != 0.25.  Add to that the surprise that is silent overflow....

> Unsigned values have some purposes, like representing bit fields, 
> representing very large integers (over signed values range) when 
> you are optimizing your code and with your profiler you have found 
> a hot spot and you want to reduce space used or increase 
> performance, to work with bitwise operators, to work with bit 
> fields, and few more.
<snip>

Interfacing file formats.  Simplifying certain conditional expressions. 
  Making code self-documenting.  Maybe others....

Stewart.


More information about the Digitalmars-d-learn mailing list