代码之家  ›  专栏  ›  技术社区  ›  T. Stone

C#int字节转换[重复]

  •  28
  • T. Stone  · 技术社区  · 14 年前

    为什么是

    byte someVar;
    someVar -= 3; 
    

    有效但

    byte someVar;
    someVar = someVar - 3;
    

    不是吗?

    2 回复  |  直到 14 年前
        1
  •  32
  •   John Kugelman Michael Hodel    14 年前

    令人惊讶的是,当您对字节执行操作时,计算将使用 int (int) 第一。这对我来说是真的 short 同样的,同样的 float 向上转换为 double

    第二个代码段等效于:

    byte someVar;
    someVar = (int) someVar - 3;
    

    正因为如此,你必须把结果放回原处 (byte) 使编译器接受赋值。

    someVar = (byte) (someVar - 3);
    
        2
  •  11
  •   Yuval Itzchakov    9 年前

    下面是CLI规范(Ecma 335)中的一个表的副本,该表指定了哪些操作数对类型为a op B的二进制数字运算符有效,其中a和B是操作数,“op”是运算符,如操作码.Sub在代码段中使用的:

    alt text

    这需要一些注释:

    • “native int”是C程序中的IntPtr
    • F级 表示浮点类型,在C中为double或float#
    • & 表示指针值,由于框是不安全的操作,因此框被着色
    • O 表示对象引用
    • 是不允许的行动。

    请注意的行和列 F级

    与您的问题相关:还要注意byte、sbyte、char、short和ushort类型不存在。同样的方法,编译器将操作数转换为可以表示值的最小类型,以便可以使用运算符。是int32。根据表,操作的结果将是int32。

    现在问题来了:结果是int32,但是将其赋回到字节值需要一个缩小的转换。从32位到8位。这是个麻烦,因为它会丢失大量的比特。C编译器要求您将其显式化。你基本上承认你知道你在做什么,并且你意识到潜在的令人惊讶的结果。就像这个:

    byte v = 255;
    v = (byte)(v + 1);
    

    -=运算符是一个问题,因为没有有效的方法应用所需的强制转换。它在语言语法中是不可表达的。使用(byte)3是没有意义的,文本会被转换成int32以使操作符工作。

    他们解决了这个问题,编译器在没有你帮助的情况下自动发出强制转换。