www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - Compilation error while adding two shorts

reply "David Zaragoza" <david zaragoza.com.ve> writes:
Hello

I'm trying to compile the following program:

module main;

int main(string[] argv){
	short asd = 1;
	short qwe = asd + asd;
	return 0;
}

And the compiler gives this error:

C:\David>dmd simple
simple.d(5): Error: cannot implicitly convert expression 
(cast(int)asd + cast(in
t)asd) of type int to short

Why is there a cast if I'm adding to shorts?

Regards
Jun 23 2014
parent reply =?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com> writes:
On 06/23/2014 10:03 PM, David Zaragoza wrote:> Hello
 I'm trying to compile the following program:

 module main;

 int main(string[] argv){
      short asd = 1;
      short qwe = asd + asd;
      return 0;
 }

 And the compiler gives this error:

 C:\David>dmd simple
 simple.d(5): Error: cannot implicitly convert expression (cast(int)asd +
 cast(in
 t)asd) of type int to short

 Why is there a cast if I'm adding to shorts?

 Regards
This is a common gotcha of system languages like C, C++, and D. Operations like + are never executed in types like 'short'.[1] Since the result of that + is int, the compiler does not allow assigning the value back to a short, which can lose data. However, in this case it is clear that the value of asd is known to be 1 at compile time and that there will not be data loss. The D compilers apply what is known as 'value range propagation'[2], which should take care of your issue. I guess the use in your program is too complicated for the current compiler. Ali [1] See both "Integer Promotions" and "Usual Arithmetic Conversions" here: http://dlang.org/type.html [2] "Value Range Propagation" http://www.drdobbs.com/tools/value-range-propagation/229300211
Jun 23 2014
parent "David Zaragoza" <david zaragoza.com.ve> writes:
Interesting info, I've never seen this behavior in C since the 
conversion is implicit as [2] notes. A simple cast resolves the 
problem in D:

module main;

int main(string[] argv){
	short asd = 1;
	short qwe = cast(short)(asd + asd);
	return 0;
}

Thanks for your answer :)
Jun 24 2014