为什么从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?