digitalmars.D.learn - Operator implicit conversion difference
- ixid (8/8) Nov 05 2015 This may have been overlooked in my other thread so I wanted to
- =?UTF-8?Q?Ali_=c3=87ehreli?= (6/7) Nov 05 2015 Apparently not:
- BBaz (13/21) Nov 06 2015 What's inconsistent is the integral promotion of the add
- =?UTF-8?Q?Ali_=c3=87ehreli?= (5/30) Nov 06 2015 You say 'long' but according to integer promotions, a and b should both
- BBaz (4/32) Nov 06 2015 oh...sorry I thought that the widening was done to the follwing
This may have been overlooked in my other thread so I wanted to ask again: This seems very inconsistent, does a += b not lower to a = a + b? I guess not based on the below: ushort a = ushort.max, b = ushort.max; a += b; // Compiles fine a = a + b; // Error: cannot implicitly convert expression (cast(int)a + cast(int)b) of type int to ushort
Nov 05 2015
On 11/05/2015 05:20 AM, ixid wrote:This seems very inconsistent, does a += b not lower to a = a + b?Apparently not: http://dlang.org/expression.html#AssignExpression It says "The right operand is implicitly converted to the type of the left operand". So, the rules are different. Ali
Nov 05 2015
On Thursday, 5 November 2015 at 13:20:26 UTC, ixid wrote:This may have been overlooked in my other thread so I wanted to ask again: This seems very inconsistent, does a += b not lower to a = a + b? I guess not based on the below: ushort a = ushort.max, b = ushort.max; a += b; // Compiles fine a = a + b; // Error: cannot implicitly convert expression (cast(int)a + cast(int)b) of type int to ushortWhat's inconsistent is the integral promotion of the add expression result that stops from 4 bytes int: --- int a, b; a += b; a = a + b; --- is compiled but according to the specs, a + b result should be widened to long: http://dlang.org/expression.html#AddExpression (ubyte, byte) until (uint int) should be widened and (long , ulong) wrapped. This behavior would match the specs better.
Nov 06 2015
On 11/06/2015 04:56 PM, BBaz wrote:On Thursday, 5 November 2015 at 13:20:26 UTC, ixid wrote:You say 'long' but according to integer promotions, a and b should both be promoted to 'int' and the result of 'a + b' is int: http://dlang.org/type.html#integer-promotions AliThis may have been overlooked in my other thread so I wanted to ask again: This seems very inconsistent, does a += b not lower to a = a + b? I guess not based on the below: ushort a = ushort.max, b = ushort.max; a += b; // Compiles fine a = a + b; // Error: cannot implicitly convert expression (cast(int)a + cast(int)b) of type int to ushortWhat's inconsistent is the integral promotion of the add expression result that stops from 4 bytes int: --- int a, b; a += b; a = a + b; --- is compiled but according to the specs, a + b result should be widened to long: http://dlang.org/expression.html#AddExpression (ubyte, byte) until (uint int) should be widened and (long , ulong) wrapped. This behavior would match the specs better.
Nov 06 2015
On Saturday, 7 November 2015 at 01:10:01 UTC, Ali Çehreli wrote:On 11/06/2015 04:56 PM, BBaz wrote:oh...sorry I thought that the widening was done to the follwing type that's bigger, eg byte->short, short->int. So no inconsistence at all.On Thursday, 5 November 2015 at 13:20:26 UTC, ixid wrote:You say 'long' but according to integer promotions, a and b should both be promoted to 'int' and the result of 'a + b' is int: http://dlang.org/type.html#integer-promotions Ali[...]What's inconsistent is the integral promotion of the add expression result that stops from 4 bytes int: --- int a, b; a += b; a = a + b; --- is compiled but according to the specs, a + b result should be widened to long: http://dlang.org/expression.html#AddExpression (ubyte, byte) until (uint int) should be widened and (long , ulong) wrapped. This behavior would match the specs better.
Nov 06 2015