Am Wed, 19 Nov 2014 18:20:24 +0000 schrieb "Marc Schütz" <schue...@gmx.net>:
> I'd say length being unsigned is fine. The real mistake is that > the difference between two unsigned values isn't signed, which > would be the most "correct" behaviour. Now take my position where I explicitly write code relying on the fact that `bigger - smaller` yields correct results. uint bigger = uint.max; uint smaller = 2; if (bigger > smaller) { auto added = bigger - smaller; // Now 'added' is an int with the value -3 ! } else { auto removed = smaller - bigger; } In fact checking which value is larger is the only way to handle the full result range of subtracting two machine integers which is ~2 times larger than what the original type can handle: T.min - T.max .. T.max - T.min This is one reason why I'd like to just keep working with the original unsigned type, but split the range around the positive/negative pivot with an if-else. Implicit conversion of unsigned subtractions to signed values would make the above code unnecessarily hard. > Let people cast the result > if they want wrapping (or better, use a helper function to > document the intentiion). -- Marco