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