Problem with object understanding and datatypes

Ali Çehreli acehreli at yahoo.com
Sat May 25 15:29:12 PDT 2013


On 05/25/2013 11:57 AM, Namal wrote:

 > I have one more question towards using unsigned datatype
 >
 >    assert(sint(-2_147_483_647) - sint(3) == sint(-2_147_483_648));
 >    assert(sint(-2_147_483_647) - sint(3) == sint(2_147_483_648));
 >
 > Here I get an error for the second line, because it cannot be convertet

It helps a lot if you tell the error message. After making some 
assumption I was able to produce an error message:

Error: cannot implicitly convert expression (2147483648L) of type long 
to int

It makes sense if sint is Saturated!int. 2147483648 is long but the 
struct member is int.

 > if i use unsigned
 >
 >    assert(sint(-2_147_483_647) - sint(3) == sint(-2_147_483_648));
 >    assert(sint(-2_147_483_647) - sint(3) == sint(2_147_483_648u));
 >
 > it makes no difference and I get an error.

This time 2_147_483_648u is a uint which happens to have automatic 
conversion to int. Automatic type conversions can be extremely 
confusing. Let's see...

import std.stdio;

struct S
{
     int i;
}

void main()
{
     // uint converts to int:
     auto s = S(1u);

     int i;
     uint u = uint.max;
     // same:
     i = u;

     // Surprising result:
     assert(i == -1);
}

These rules are both because they are same or similar in C and also for 
convenience. But yes, they can be confusing...

Ali



More information about the Digitalmars-d-learn mailing list