C# 为什么从Int16变量中减去Int16参数的结果是Int32?

C# 为什么从Int16变量中减去Int16参数的结果是Int32?,c#,.net,variables,C#,.net,Variables,可能重复: 我有这样一种方法: void Method(short parameter) { short localVariable = 0; var result = localVariable - parameter; } 为什么结果是Int32而不是Int16?它不仅仅是减法,根本不存在短(或字节/sbyte)算法 short a = 2, b = 3; short c = a + b; 将给出无法将int(a+b)转换为short(c)的错误 还有一个几乎

可能重复:

我有这样一种方法:

 void Method(short parameter)
 {
     short localVariable = 0;
     var result = localVariable - parameter;
 }

为什么结果是
Int32
而不是
Int16

它不仅仅是减法,根本不存在短(或字节/sbyte)算法

short a = 2, b = 3;
short c = a + b;
将给出无法将int(a+b)转换为short(c)的错误

还有一个几乎从不使用short的理由

附加:在任何计算中,short和sbyte总是“加宽”到int、ushort和byte到uint。这种行为可以追溯到K&R C(很可能比这还要古老)


(旧的)原因是,在处理字符时,效率和溢出问题。最后一个理由对于C语言不再是如此强大,因为字符是16位而不是隐式地转换成int。但是很幸运C语言的数值表达式与C和C++保持高度兼容。

< P>我认为它是自动完成的,以避免溢出,

假设你做了这样的事情

Short result = Short.MaxValue + Short.MaxValue; 
很明显,这个结果在短期内是不合适的


有一件事我不明白,那为什么不对自动转换为long的int32也这样做呢?

默认情况下,所有整数小于int32的操作在计算之前都会加宽到32位。结果为Int32的原因只是在计算后保持原样。如果检查MSIL算术操作码,则它们操作的唯一整数类型是Int32和Int64。这是“设计的”

如果您希望返回Int16格式的结果,那么执行强制转换代码或者编译器(以形位法)发出“隐藏”转换是不相关的

此外,上面的例子可以很容易地用cast解决

short a = 2, b = 3;

short c = (short) (a + b);
这两个数字将扩展到32位,被减法,然后被截断回16位,这就是MS的预期

使用short(或byte)的优点主要是在有大量数据(图形数据、流等)的情况下进行存储


还有,这篇文章是“a”表示发音以辅音开头的单词,是“an”表示发音形式以元音开头的单词。一个数字,一个整数;)

本文中给出的其他答案以及这里给出的讨论都很有启发性:

(一)

(二)

(三)

但仅仅是给它添上一道皱纹,它就取决于您使用的操作符。对于各种数值类型,递增(++)和递减(-)运算符以及加法赋值(+=)和减法赋值(-=)运算符都是重载的,它们在返回结果时执行额外的步骤,将结果转换回操作数的类型

例如,使用short:

short s = 0;

s++;                // <-- Ok
s += 1;             // <-- Ok
s = s + 1;          // <-- Compile time error!
s = s + s;          // <-- Compile time error!

无论如何,这只是整个讨论的另一个方面…

你看到的效果

short - short = int
…在这个堆栈溢出问题中进行了广泛的讨论:

关于为什么会这样,有很多好的信息和一些有趣的讨论

下面是一个投票率很高的答案:

我相信这基本上是为了 对性能的评价。(就"为什么"而言) “这是因为 C#for没有定义任何运算符吗 带字节、sbyte、短或 就像其他人说的,这 答案是为什么这些运营商 没有定义。)

处理器具有本机操作来 用32位做算术运算非常困难 迅速地。做转换回来 从结果到一个字节 可以自动完成,但会 在以下情况下导致绩效处罚: 如果你真的不想 这种行为

--乔恩·斯基特


顺便问一下:哪个是正确的不定冠词?“an”或“a”?任何类型T的两个值的加减都会产生一个不适合类型T的结果。还可以看到这个问题:这实际上与相同,只是不同的类型和不同的运算符。我想这是一个,因为Int32以“I”开头,但我不是英语母语的人…+1回答不错。(你对这篇不定冠词的回答值得奖励。;-)太好了,Kek444。您应该添加此相关问题的答案()。我肯定会投赞成票。谢谢你的积极评论,我会的。小挑剔,他们是“加宽”而不是“四舍五入”。整数不需要舍入到更大的大小,浮点数需要。是的,谢谢,你是对的,我的意思是位数被舍入,而数字本身被加宽。我会清理它。这样做不是为了防止溢出,更不是为了阻止低效的代码。它是从C/C++继承而来的。应该注意,这是C#/CLI标准的一部分。
short s
s += (short)1;
short - short = int