byte = byte - byte所需的类型转换?

时间:2010-04-17 04:42:34

标签: c# .net c#-3.0

我有以下代码:

foreach (byte b in bytes)
{
    byte inv = byte.MaxValue - b;
    // Add the new value to a list....
}

当我这样做时,我收到以下错误:

Cannot implicitly convert type 'int' to 'byte'. 
An explicit conversion exists (are you missing a cast?)

此语句的每个部分都是一个字节。为什么C#想要将byte.MaxValue - b转换为int?

如果没有施法,你不应该这样做吗? (即我不想这样做:byte inv = (byte) (byte.MaxValue - b);

3 个答案:

答案 0 :(得分:4)

根据C# Language Reference

  

因为赋值运算符右侧的算术表达式默认值为。

原因可能是因为处理器访问4字节内存地址的速度比1字节内存地址快,因此算术运算符定义为4字节操作数。

答案 1 :(得分:4)

Raymond Chen在这里回答你的问题:

http://blogs.msdn.com/oldnewthing/archive/2004/03/10/87247.aspx

答案 2 :(得分:2)

对于加法,乘法和减法,有一个相当不错的解释:在计算中包括进位,然后将它们丢弃比如果它们最初被丢弃时更容易计算进位。

对于按位运算符(交集,包含联合,独占联合,补语),推理根本不存在水。我唯一能想到的是,如果你开始使用有符号和无符号操作数的混合,然后将结果保存为更宽的类型,那么符号扩展会有些含糊不清。但这并不能解释为什么按位运算是一元的,或者所有操作数具有相同类型的运算应该将结果扩展到int。我认为这是一个非常令人烦恼的C#设计缺陷:

byte a, b;
byte c = a | b;

生成错误。