Am 22.01.2012, 18:00 Uhr, schrieb Ali Çehreli <acehr...@yahoo.com>:

On 01/22/2012 04:49 AM, Jonathan M Davis wrote:

 > Another potentially nasty situation is subtraction. It
> can do fun things when you subtract one unsigned type from another if you're > not careful (since if the result is negative and is then assigned to an
 > unsigned integer...).

No need to assign the result explicitly either. Additionally, the subtraction is someties implicit.

When the expression has an unsigned in it, the temporary result is unsigned by the language rules since C:

import std.stdio;

int foo()
{
     return -2;
}

uint bar()
{
     return 1;
}

void main()
{
     writeln(foo() + bar());
}

The program above prints 4294967295.

It may make perfect sense for bar() to return an unsigned type (like arrays' .length property), but every time I decide on an unsigned type, I think about the potentially-unintended implicit conversion to unsigned that may bite the users of bar().

Ali

That's a valid point, if the order "foo() + bar()" makes sense and a negative value is expected. After all foo() and bar() must be related somehow, otherwise you wouldn't add them. In this case, if the expected result is a signed int, I would make bar() return a signed int as well and not treat that case like array.length!

Reply via email to