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

可能重复:
byte + byte = int …为什么?

我有这样的方法:

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

为什么结果是Int32而不是Int16

它不仅仅是减法,只是没有短(或字节/字节)算术。

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

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

几乎从不使用短片的另一个原因。

附加:在任何计算中,short和sbyte将始终“扩展”为int,ushort和byte to uint。 这种行为可以追溯到K&R C(并且可能比这还要老)。

(旧的)原因是,处理char时,afaik,效率和溢出问题。 最后一个原因不再适用于C#,其中char是16位且不能隐式转换为int。 但非常幸运的是,C#数字表达式在很大程度上与C和C ++保持兼容。

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

如果您希望以Int16格式返回结果,那么如果您执行代码转换,或者编译器(hypotetically)在“引擎盖下”发出转换,则无关紧要。

此外,上述示例可以通过演员轻松解决

 short a = 2, b = 3; short c = (short) (a + b); 

这两个数字将扩展为32位,被减去,然后被截断回16位,这就是MS的预期。

使用短(或字节)的优点主要是存储大量数据(图形数据,流媒体等)的情况

PS哦,文章对于发音以辅音开头的单词是“a”,对于发音forms以元音开头的单词是“an”。 一个数字,AN int。 ;)

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

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

(2) byte + byte = int …为什么?

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

但只是为了给它带来另一个皱纹,它可能取决于你使用的运算符。 增量(++)和减量( – )运算符以及加法赋值(+ =)和减法赋值( – =)运算符因各种数值类型而重载,并且它们执行转换结果的额外步骤返回结果时返回操作数的类型。

例如,使用short:

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

使用字节:

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

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

 short s s += (short)1; 

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

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

让我们说你做这样的事情。

 Short result = Short.MaxValue + Short.MaxValue; 

结果显然不适合简短。

我不明白的一件事是,为什么不为int32做它自动转换为长???

你看到的效果……

 short - short = int 

…在Stackoverflow问题中广泛讨论[link] byte + byte = int …为什么?

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

这是“最高投票”答案:

我相信这基本上是为了表现。 (就“为什么会发生这种情况”而言,因为没有任何运算符由C#定义用于byte,sbyte,short或ushort的算法,正如其他人所说的那样。这个答案是为什么没有定义这些运算符的原因。)

处理器具有本机操作,可以非常快速地使用32位进行算术运算。 可以自动完成从结果到字节的转换,但在您实际上不需要该行为的情况下会导致性能损失。

– Jon Skeets

请享用,

Robert C. Cartaino