整数蓝色,短+ +短问题

时间:2010-12-03 08:16:35

标签: c# types int short

用C#编程:

short a, b;
a = 10;
b = 10;
a = a + b; // Error : Cannot implicitly convert type 'int' to 'short'.

// we can also write this code by using Arithmetic Assignment Operator as given below

a += b; // But this is running successfully, why?

Console.Write(a);

5 个答案:

答案 0 :(得分:71)

这里有两个问题。第一个是“为什么短期加上短期结果在int?”

好吧,假设短期和空头很短,看看会发生什么:

short[] prices = { 10000, 15000, 11000 };
short average = (prices[0] + prices[1] + prices[2]) / 3;

如果这个计算是短暂的,那么平均值当然是-9845。总和大于最大可能的短,所以它回绕到负数,然后你除去负数。

在整数运算包围的世界中,在int中进行所有计算更为明智,这种类型可能具有足够的范围以便典型计算不会溢出。

第二个问题是:

  • short plus short is int
  • 将int指定为short是非法的
  • a + = b与a = a + b
  • 相同
  • 因此短+ =短应该是非法的
  • 那为什么这是合法的?

这个问题有一个错误的前提;上面的第三行是错误的。 C#规范见7.17.2节

  

否则,如果选择的运算符是   一个预定义的运算符,如果返回   所选运算符的类型是   明确可转换为类型   x,如果y是可隐式转换的   到x的类型或运算符是   换班操作员,那么操作就是   评估为x =(T)(x op y),其中T   是x的类型,除了x是   只评估一次。

编译器代表您插入强制转换。正确的推理是:

  • short plus short is int
  • 将int指定为short是非法的
  • s1 + = s2与s1 =(短)(s1 + s2)相同
  • 因此这应该是合法的

如果它没有为您插入演员表,则无法在许多类型上使用复合赋值。

答案 1 :(得分:12)

好吧,+=运算符表示您将使用short增加a的值,而=表示您将覆盖值,与操作的结果。操作a + b产生一个int,不知道它可以做什么,并且你试图将该int分配给short。

答案 2 :(得分:9)

你必须使用:

a = (short)(a + b);

关于赋值和添加赋值行为之间的区别,我想它与此有关(来自msdn)

x+=y
is equivalent to
x = x + y
except that x is only evaluated once. The meaning of the + operator is
dependent on the types of x and y (addition for numeric operands, 
concatenation for string operands, and so forth).

但是,它有点模糊,所以具有更深刻理解力的人可以发表评论。

答案 3 :(得分:7)

这是因为int是定义+的最小签名类型。任何较小的东西首先被提升为int。 +=运算符是根据+定义的,但是使用特殊情况规则来处理不符合目标的结果。

答案 4 :(得分:1)

这是因为+ =是作为重载函数实现的(其中一个是short,编译器选择最具体的重载)。对于表达式(a + b),编译器在分配之前默认将结果扩展为int。