Re: ushort + ushort = int?

2018-08-21 Thread Jim Balter via Digitalmars-d-learn

On Monday, 20 August 2018 at 08:34:56 UTC, Andrey wrote:

Hello,
Here is a code that you can execute using online compiler 
https://run.dlang.io/:



import std.stdio;
void main()
{
   ushort first = 5;
   ushort second = 1000;

   ushort result = first + second;

   writeln(result);
}


I hae this error:
onlineapp.d(7): Error: cannot implicitly convert expression 
cast(int)first + cast(int)second of type int to ushort


Why they are "int" when I declared them as "ushort"???
ushort + ushort = ushort, not int.

In C++ there aren't any such issues...


Only if you make the mistake of compiling without warnings. 
Otherwise, the C++ compiler will warn that you're converting an 
int to a ushort.


Re: ushort + ushort = int?

2018-08-20 Thread Jonathan M Davis via Digitalmars-d-learn
On Monday, August 20, 2018 4:29:56 AM MDT Andrey via Digitalmars-d-learn 
wrote:
> On Monday, 20 August 2018 at 09:56:13 UTC, Jonathan M Davis wrote:
> > It's a combination of keeping the C semantics (in general, C
> > code is valid D code with the same semantics, or it won't
> > compile) and the fact that D requires casts for narrowing
> > conversions. When you add two shorts in C/C++, it converts them
> > to int just like D does. It's just that C/C++ has implicit
> > narrowing casts, so if you assign the result to a short, it
> > then converts the result to short even if that means that the
> > value could be truncated, whereas D requires that you
> > explicitly cast to convert to int rather than silently
> > truncating.
> >
> > It does prevent certain classes of problems (e.g. there are
> > plenty of bugs in C/C++ due to implicit narrowing conversions),
> > but it can also get pretty annoying if you're doing much math
> > on integer types smaller than int, and you either know that
> > they aren't going to overflow or truncate, or you don't care
> > that they will. But if you're only doing math on such small
> > integeral types occasionally, then it pretty much just means
> > that once in a while, you get briefly annoyed when you forget
> > to add a cast, and the compiler yells at you.
> >
> > - Jonathan M Davis
>
> Understood.
> Is there a workaround to reduce amount of manual casts of input
> types T into output T?
> May be one can write some module-global operator "plus",
> "minus"..?
>
> Like in C++:
> > template
> > T operator+(T first, T second)
> >
> >{
> >
> >return static_cast(first + second);
> >
> >}

D only allows overloaded operators to be declared on types, so you can't
overload any operators for any built-in types (or any types that you don't
control the declaration of for that matter). You could create a wrapper
function and use that instead of +. You could even make it use string mixins
like opBinary does if you wanted to - e.g. something like

short doOp(string op)(short lhs, short rhs)
if(op == "+" || op == "-" || op == "*" || op == "/" || op == "%")
{
mixin("return cast(short)(lhs " ~ op ~ " rhs);");
}

val1 = val1.doOp!"+"(val2);

but you're not going to be able to get something like

val1 = val1 + val2;

to work with just short.

Alternatively, you could create a wrapper type and use that instead of using
short directly. IIRC, the last time that someone was complaining in the main
newsgroup about all of the required casts, someone posted a link to
something that did that. If the casts are too annoying for you, that would
probably be the best solution.

- Jonathan M Davis





Re: ushort + ushort = int?

2018-08-20 Thread Andrey via Digitalmars-d-learn

On Monday, 20 August 2018 at 09:56:13 UTC, Jonathan M Davis wrote:
It's a combination of keeping the C semantics (in general, C 
code is valid D code with the same semantics, or it won't 
compile) and the fact that D requires casts for narrowing 
conversions. When you add two shorts in C/C++, it converts them 
to int just like D does. It's just that C/C++ has implicit 
narrowing casts, so if you assign the result to a short, it 
then converts the result to short even if that means that the 
value could be truncated, whereas D requires that you 
explicitly cast to convert to int rather than silently 
truncating.


It does prevent certain classes of problems (e.g. there are 
plenty of bugs in C/C++ due to implicit narrowing conversions), 
but it can also get pretty annoying if you're doing much math 
on integer types smaller than int, and you either know that 
they aren't going to overflow or truncate, or you don't care 
that they will. But if you're only doing math on such small 
integeral types occasionally, then it pretty much just means 
that once in a while, you get briefly annoyed when you forget 
to add a cast, and the compiler yells at you.


- Jonathan M Davis


Understood.
Is there a workaround to reduce amount of manual casts of input 
types T into output T?
May be one can write some module-global operator "plus", 
"minus"..?


Like in C++:


template
T operator+(T first, T second)
{
   return static_cast(first + second);
}


Re: ushort + ushort = int?

2018-08-20 Thread Jonathan M Davis via Digitalmars-d-learn
On Monday, August 20, 2018 3:19:04 AM MDT Andrey via Digitalmars-d-learn 
wrote:
> On Monday, 20 August 2018 at 08:49:00 UTC, rikki cattermole wrote:
> > Yes. On x86 int's will be faster just an FYI so it does make
> > sense to use them for computation.
>
> Inconveniently always use casts. Why in D one decided to do in
> such way?

It's a combination of keeping the C semantics (in general, C code is valid D
code with the same semantics, or it won't compile) and the fact that D
requires casts for narrowing conversions. When you add two shorts in C/C++,
it converts them to int just like D does. It's just that C/C++ has implicit
narrowing casts, so if you assign the result to a short, it then converts
the result to short even if that means that the value could be truncated,
whereas D requires that you explicitly cast to convert to int rather than
silently truncating.

It does prevent certain classes of problems (e.g. there are plenty of bugs
in C/C++ due to implicit narrowing conversions), but it can also get pretty
annoying if you're doing much math on integer types smaller than int, and
you either know that they aren't going to overflow or truncate, or you don't
care that they will. But if you're only doing math on such small integeral
types occasionally, then it pretty much just means that once in a while, you
get briefly annoyed when you forget to add a cast, and the compiler yells at
you.

- Jonathan M Davis





Re: ushort + ushort = int?

2018-08-20 Thread rikki cattermole via Digitalmars-d-learn

On 20/08/2018 9:19 PM, Andrey wrote:

On Monday, 20 August 2018 at 08:49:00 UTC, rikki cattermole wrote:
Yes. On x86 int's will be faster just an FYI so it does make sense to 
use them for computation.


Inconveniently always use casts. Why in D one decided to do in such way?


C.


Re: ushort + ushort = int?

2018-08-20 Thread Andrey via Digitalmars-d-learn

On Monday, 20 August 2018 at 08:49:00 UTC, rikki cattermole wrote:
Yes. On x86 int's will be faster just an FYI so it does make 
sense to use them for computation.


Inconveniently always use casts. Why in D one decided to do in 
such way?


Re: ushort + ushort = int?

2018-08-20 Thread rikki cattermole via Digitalmars-d-learn

On 20/08/2018 8:48 PM, Andrey wrote:

On Monday, 20 August 2018 at 08:42:20 UTC, rikki cattermole wrote:

It's called integer promotion and it originates from C.
And yes C++ does have such support in some variant (I really don't 
feel like comparing the two).


And I should do? Always use "cast" operator when I operate not with ints?


Yes. On x86 int's will be faster just an FYI so it does make sense to 
use them for computation.


Re: ushort + ushort = int?

2018-08-20 Thread Andrey via Digitalmars-d-learn

On Monday, 20 August 2018 at 08:42:20 UTC, rikki cattermole wrote:

It's called integer promotion and it originates from C.
And yes C++ does have such support in some variant (I really 
don't feel like comparing the two).


And I should do? Always use "cast" operator when I operate not 
with ints?


Re: ushort + ushort = int?

2018-08-20 Thread rikki cattermole via Digitalmars-d-learn

On 20/08/2018 8:34 PM, Andrey wrote:

Hello,
Here is a code that you can execute using online compiler 
https://run.dlang.io/:



import std.stdio;
void main()
{
   ushort first = 5;
   ushort second = 1000;

   ushort result = first + second;

   writeln(result);
}


I hae this error:
onlineapp.d(7): Error: cannot implicitly convert expression 
cast(int)first + cast(int)second of type int to ushort


Why they are "int" when I declared them as "ushort"???
ushort + ushort = ushort, not int.

In C++ there aren't any such issues...


It's called integer promotion and it originates from C.
And yes C++ does have such support in some variant (I really don't feel 
like comparing the two).


ushort + ushort = int?

2018-08-20 Thread Andrey via Digitalmars-d-learn

Hello,
Here is a code that you can execute using online compiler 
https://run.dlang.io/:



import std.stdio;
void main()
{
   ushort first = 5;
   ushort second = 1000;

   ushort result = first + second;

   writeln(result);
}


I hae this error:
onlineapp.d(7): Error: cannot implicitly convert expression 
cast(int)first + cast(int)second of type int to ushort


Why they are "int" when I declared them as "ushort"???
ushort + ushort = ushort, not int.

In C++ there aren't any such issues...