可能重复:
byte + byte = int… why?
我有这样的方法:
void Method(short parameter)
{
short localVariable = 0;
var result = localVariable - parameter;
}
为什么结果是Int32
而不是Int16
?
答案 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#?
(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