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

可能重复:
字节+字节=整数...为什么?

我有这样的方法:

 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和sbyte总是会被“加宽”为int,ushort和byte为uint。 这种行为可以追溯到K&R C(并且probaly比这更早)。

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


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

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

另外,上面的例子可以很容易地通过演员来解决

short a = 2, b = 3;

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

这两个数字将扩展到32位,进行相减,然后截断回到16位,这就是MS的意图。

使用短(或字节)的优势主要在于存储海量数据(图形数据,流媒体等)时的存储空间,

PS哦,这篇文章对于发音以辅音开头的单词是“a”,对于其发音形式以元音开头的单词是“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;

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

链接地址: http://www.djcxy.com/p/21107.html

上一篇: Why is the result of a subtraction of an Int16 parameter from an Int16 variable an Int32?

下一篇: Why is a cast required for byte subtraction in C#?