C# 为什么从Int16变量中减去Int16参数的结果是Int32?
可能重复:C# 为什么从Int16变量中减去Int16参数的结果是Int32?,c#,.net,variables,C#,.net,Variables,可能重复: 我有这样一种方法: 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)的错误 还有一个几乎
我有这样一种方法:
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的理由
附加:在任何计算中,short和sbyte总是“加宽”到int、ushort和byte到uint。这种行为可以追溯到K&R C(很可能比这还要古老)
(旧的)原因是,在处理字符时,效率和溢出问题。最后一个理由对于C语言不再是如此强大,因为字符是16位而不是隐式地转换成int。但是很幸运C语言的数值表达式与C和C++保持高度兼容。 < P>我认为它是自动完成的,以避免溢出, 假设你做了这样的事情
Short result = Short.MaxValue + Short.MaxValue;
很明显,这个结果在短期内是不合适的
有一件事我不明白,那为什么不对自动转换为long的int32也这样做呢?默认情况下,所有整数小于int32的操作在计算之前都会加宽到32位。结果为Int32的原因只是在计算后保持原样。如果检查MSIL算术操作码,则它们操作的唯一整数类型是Int32和Int64。这是“设计的” 如果您希望返回Int16格式的结果,那么执行强制转换代码或者编译器(以形位法)发出“隐藏”转换是不相关的 此外,上面的例子可以很容易地用cast解决
short a = 2, b = 3;
short c = (short) (a + b);
这两个数字将扩展到32位,被减法,然后被截断回16位,这就是MS的预期
使用short(或byte)的优点主要是在有大量数据(图形数据、流等)的情况下进行存储
还有,这篇文章是“a”表示发音以辅音开头的单词,是“an”表示发音形式以元音开头的单词。一个数字,一个整数;) 本文中给出的其他答案以及这里给出的讨论都很有启发性: (一) (二) (三) 但仅仅是给它添上一道皱纹,它就取决于您使用的操作符。对于各种数值类型,递增(++)和递减(-)运算符以及加法赋值(+=)和减法赋值(-=)运算符都是重载的,它们在返回结果时执行额外的步骤,将结果转换回操作数的类型 例如,使用short:
short s = 0;
s++; // <-- Ok
s += 1; // <-- Ok
s = s + 1; // <-- Compile time error!
s = s + s; // <-- Compile time error!
无论如何,这只是整个讨论的另一个方面…你看到的效果
short - short = int
…在这个堆栈溢出问题中进行了广泛的讨论:
关于为什么会这样,有很多好的信息和一些有趣的讨论
下面是一个投票率很高的答案:
我相信这基本上是为了
对性能的评价。(就"为什么"而言)
“这是因为
C#for没有定义任何运算符吗
带字节、sbyte、短或
就像其他人说的,这
答案是为什么这些运营商
没有定义。)
处理器具有本机操作来
用32位做算术运算非常困难
迅速地。做转换回来
从结果到一个字节
可以自动完成,但会
在以下情况下导致绩效处罚:
如果你真的不想
这种行为
--乔恩·斯基特
顺便问一下:哪个是正确的不定冠词?“an”或“a”?任何类型T的两个值的加减都会产生一个不适合类型T的结果。还可以看到这个问题:这实际上与相同,只是不同的类型和不同的运算符。我想这是一个,因为Int32以“I”开头,但我不是英语母语的人…+1回答不错。(你对这篇不定冠词的回答值得奖励。;-)太好了,Kek444。您应该添加此相关问题的答案()。我肯定会投赞成票。谢谢你的积极评论,我会的。小挑剔,他们是“加宽”而不是“四舍五入”。整数不需要舍入到更大的大小,浮点数需要。是的,谢谢,你是对的,我的意思是位数被舍入,而数字本身被加宽。我会清理它。这样做不是为了防止溢出,更不是为了阻止低效的代码。它是从C/C++继承而来的。应该注意,这是C#/CLI标准的一部分。
short s
s += (short)1;
short - short = int