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

时间:2009-07-05 19:27:14

标签: c# .net variables

  

可能重复:
  byte + byte = int… why?

我有这样的方法:

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

为什么结果是Int32而不是Int16

5 个答案:

答案 0 :(得分:11)

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

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 ++保持兼容。

答案 1 :(得分:7)

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

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

此外,上面的例子可以通过演员

轻松解决
short a = 2, b = 3;

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

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

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

P.S。哦,文章是“a”代表发音以辅音开头的单词,而“an”代表发音形式以元音开头的单词。一个数字,AN int。 ;)

答案 2 :(得分:3)

这个帖子中给出的其他答案,以及这里给出的讨论都是有益的:

(1)Why is a cast required for byte subtraction in C#?

(2)byte + byte = int… why?

(3)Why is a cast required for byte subtraction in C#?

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

例如,使用short:

short s = 0;

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

使用byte:

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;

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

答案 3 :(得分:1)

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

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

Short result = Short.MaxValue + Short.MaxValue; 

结果显然不合适。

我不明白的一件事就是为什么不为int32这样做会自动转换为long ???

答案 4 :(得分:1)

你看到的效果......

short - short = int

...在此Stackoverflow问题中广泛讨论[link] byte + byte = int… why?

有很多好的信息以及一些有趣的讨论,为什么会这样。

这是“最高投票”答案:

  

我相信这基本上是为了这个   表现。 (就“为什么而言”而言   发生在所有“它是因为那里   不是由C#定义的任何运算符   算术用byte,sbyte,short或   正如其他人所说的那样。这个   回答是为什么那些运营商   没有定义。)

     

处理器具有本机操作   非常用32位算术   很快。进行转换   从结果到一个字节   可以自动完成,但会   导致性能损失   你实际上并不想要的情况   那种行为。

     

- Jon Skeets

享受,

Robert C. Cartaino