代码之家  ›  专栏  ›  技术社区  ›  Vaccano

byte=byte需要类型转换吗?

  •  8
  • Vaccano  · 技术社区  · 14 年前

    我有以下代码:

    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 回复  |  直到 14 年前
        1
  •  4
  •   Bill the Lizard    14 年前

    根据 C# Language Reference :

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

    这可能是因为你的处理器在访问一个4字节的内存地址时要比1字节的内存地址快,所以算术运算符被定义为工作在4字节的操作数上。

        2
  •  4
  •   Eric Lippert    14 年前
        3
  •  2
  •   Ben Voigt Caesar    14 年前

    对于加法、乘法和减法,有一个相当好的解释:在计算中包括进位位,然后把它们扔掉要比算出进位位要容易得多。

    对于按位运算符(交集、包含并集、排除并集、补集),这种推理根本站不住脚。我唯一能想到的是,如果从一个有符号和无符号操作数的混合物开始,然后将结果保存在更宽的类型中,符号扩展会有点模糊。但这并不能解释为什么一元操作或所有操作数都具有相同类型的逐位操作会使结果变宽。 int . 我认为这是一个非常恼人的设计缺陷:

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

    生成错误。