我已将我的问题总结为以下代码片段。我有两个短变量,我将这两个变量添加到另一个短变量中,但是我得到了编译时错误。为什么会这样?
1.short x = 1, y = 1;
2.short z = x + y;
在第2行编译时间错误 修改
If short+short=int
then why int+int !=long
答案 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)
您需要投射short z = (short)(x + y);
答案 3 :(得分:1)
这是一个“功能”。说真的,我向微软发布了一个关于字节数学的类似问题。我不知道你是否可以在没有登录的情况下看到我的帖子,但回复是:
这是设计,并且是由于 有关数字推广的规则,以及 没有预定义的运营商 对于字节。 (它也把我绊倒了 我第一次遇到它。 ; - )
这是相关部分 语言规范。虽然 例子是乘法,相同 坚持加号。
希望有所帮助
桑托什
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);