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

Why is the result of a subtraction of an Int16 parameter from an Int16 variable an Int32?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
byte + byte = int… why?

我有这样的方法:

1
2
3
4
5
 void Method(short parameter)
 {
     short localVariable = 0;
     var result = localVariable - parameter;
 }

为什么结果是一个Int32而不是一个Int16


这不仅仅是减法,简单地存在没有短(或字节/字节)算术。

1
2
short a = 2, b = 3;
short c = a + b;

将给出无法将int(a+b)转换为short(c)的错误。

还有一个原因是几乎从不使用短。

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

这(旧)的原因是,在处理char时,afaik、效率和溢出问题。最后一个理由不再适用于C语言,因为字符是16位而不是隐式地转换为int。但是,非常幸运的是,C的数值表达式与C和C++保持了很高的相容性。


在默认情况下,所有整数小于Int32的操作在计算之前都被扩大到32位。结果为Int32的原因只是简单地保留计算后的结果。如果检查msil算术操作码,则它们操作的唯一整数数字类型是Int32和Int64。这是"按设计"。

如果您希望结果返回到int16格式,那么如果您执行了强制转换代码,或者编译器(在底层)发出转换,则与此无关。

同样,上面的例子也可以很容易地用铸件来解决。

1
2
3
short a = 2, b = 3;

short c = (short) (a + b);

这两个数字将扩展到32位,被减去,然后被截短到16位,这就是微软想要的。

使用短(或字节)的优势主要在于存储大量数据(图形数据、流媒体等)的情况。

另外,这篇文章是"A",是指发音以辅音开头的单词,而"A"是指发音以元音开头的单词。一个数字,一个整数;)


本主题中给出的其他答案以及此处给出的讨论具有指导意义:

(1)为什么C中的字节减法需要强制转换?

(2)字节+字节=整数…为什么?

(3)为什么C中的字节减法需要强制转换?

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

例如,使用short:

1
2
3
4
5
6
short s = 0;

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

使用字节:

1
2
3
4
5
6
byte b = 0;

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

如果他们不这样做,那么使用递增运算符(++)的调用将不可能,并且对加法赋值运算符的调用最多也会比较尴尬,例如:

1
2
short s
s += (short)1;

总之,这只是整个讨论的另一个方面…


你看到的效果…

1
short - short = int

…在这个stackoverflow问题中被广泛讨论:【链接】byte+byte=int…为什么?

有很多好的信息和一些有趣的讨论为什么是这样。

以下是"最高投票"答案:

I believe it's basically for the sake
of performance. (In terms of"why it
happens at all" it's because there
aren't any operators defined by C# for
arithmetic with byte, sbyte, short or
ushort, just as others have said. This
answer is about why those operators
aren't defined.)

Processors have native operations to
do arithmetic with 32 bits very
quickly. Doing the conversion back
from the result to a byte
automatically could be done, but would
result in performance penalties in the
case where you don't actually want
that behaviour.

-- Jon Skeets

享受,

罗伯特·C·卡塔诺


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

假设你做了这样的事情。

1
Short result = Short.MaxValue + Short.MaxValue;

很明显,这个结果不符合实际。

有一件事我不明白,那为什么不为int32做同样会自动转换为long呢????