添加两个短变量[C#]时编译时间错误

时间:2011-04-13 16:26:18

标签: c#

  

可能重复:
  Integer summing blues, short += short problem

我已将我的问题总结为以下代码片段。我有两个短变量,我将这两个变量添加到另一个短变量中,但是我得到了编译时错误。为什么会这样?

 1.short x = 1, y = 1;
 2.short z = x + y;   

在第2行编译时间错误 修改

If short+short=int

then why int+int !=long

6 个答案:

答案 0 :(得分:6)

按规范short + short -> int。做short z = (short)(x + y);

最佳答案由Eric Lippert在此提供:Integer summing blues, short += short problem

答案 1 :(得分:2)

没有为short定义添加运算符。编译器会自动将这些值转换为int以进行添加。因此,表达式x + y的类型将为int。将int表达式分配给类型short的变量时,需要强制转换。像这样:

short z = (short)(x + y);

注意 通常不需要以下信息。

如果您担心检查上下文中的溢出,请执行以下操作:

short z = unchecked((short)(x + y));

这通常不是必需的,因为未选中是大多数(或所有)C#编译器的默认设置,并且该设置几乎不会更改。如果赋值出现在checked语句中,那么可能是编写代码的人知道他们正在做什么。

答案 2 :(得分:2)

这是documented behaviour

您需要投射short z = (short)(x + y);

答案 3 :(得分:1)

这是一个“功能”。说真的,我向微软发布了一个关于字节数学的类似问题。我不知道你是否可以在没有登录的情况下看到我的帖子,但回复是:

https://connect.microsoft.com/VisualStudio/feedback/details/92880/byte-bit-wise-and-math-requires-work-around#details

  

这是设计,并且是由于   有关数字推广的规则,以及   没有预定义的运营商   对于字节。 (它也把我绊倒了   我第一次遇到它。 ; - )

     

这是相关部分   语言规范。虽然   例子是乘法,相同   坚持加号。

     

希望有所帮助

     

桑托什

     

14.2.6数字促销本条款内容丰富。数字   促销包括自动   执行某些隐含的   转换的操作数   预定义的一元和二进制数字   运营商。数字促销不是一个   不同的机制,而是一个   应用重载决策的效果   到预定义的运算符。数字   促销具体不影响   评估用户定义的运算符,   虽然用户定义的运算符可以   实施以展示类似   效果。作为数字的一个例子   促销,考虑预定义   二进制的实现*   operator:int operator *(int x,int   Y); uint operator *(uint x,uint y);   长算子*(长x,长y); ULONG   operator *(ulong x,ulong y);空虚   operator *(long x,ulong y);空虚   operator *(ulong x,long y);浮动   operator *(float x,float y);双   operator *(double x,double y);   十进制运算符*(十进制x,十进制   Y);当重载决策规则   (§14.4.2)适用于这套   运营商,效果就是选择了   第一个运营商   隐含转换存在于   操作数类型。 [例如:对于   操作b * s,其中b是一个字节和   s是一个简短的重载决策   选择operator *(int,int)作为   最佳运营商。因此,效果是   b和s转换为int,和   结果的类型是int。   同样,对于操作i * d,   其中我是一个int,d是双,   重载决策选择运算符   *(双,双)作为最佳运算符。结束例子]结束   信息文本。

答案 4 :(得分:0)

两个短片CAN可以制作一个INT,因此无法隐式地将X + Y作为短路。 将其更改为

int z = x + y; 

它会运行

根据评论我添加以下代码示例以清除一些问题:

    class BasicMath
   {

         short s_max = short.MaxValue; // the max value for a short (or an Int16) is 32767
         int i_max = int.MaxValue; // the max value for an int (or an Int32) is 2,147,483,647
         long l_max = long.MaxValue; // the max value for a long (Int64) is 9,223,372,036,854,775,807

      public int AddingShorts(short x, short y)
      {


         short addedvalues = (short)(x + y);
         //yes this will compile and run, but the result of 32767 + 32767 = -2

         //short addedShorts = (short)s_max + s_max;

         int addedInts = i_max + i_max;
         //No, this doesn't require a cast, but it also achieves the spectaclar result of 
         //2,147,483,647 + 2,147,483,647 = -2
         return addedvalues;
         //casting a short to an int works implicitly (note the return type here is int, not short)
         //still if you pass in values of exceeding 32767 you will end up with -2 because attempting
         //cast as a short a value of greater than 32767 results in -2. 
      }


   }

为什么编译器要求short + short为(至少)一个int并且不对int应用相同的规则? 问安德斯......事实是这是“编译器强制执行的规则”,以“Y”结尾的所有日子

如果你试图简单地将两个短裤的总和CAST作为一个短片,是的,它会编译,但它也很容易产生你不会满意的结果。

干杯

答案 5 :(得分:0)

那是因为两个Int16的总和是Int32,所以你可能需要一个演员:

 short z = (short)(x + y);