C#int字节转换

时间:2010-09-04 07:15:11

标签: c# int byte

为什么

byte someVar;
someVar -= 3; 

有效,但

byte someVar;
someVar = someVar - 3;

心不是?

2 个答案:

答案 0 :(得分:30)

令人惊讶的是,当您对字节执行操作时,将使用int值完成计算,首先将字节隐式转换为(int)。对于short也是如此,类似的float在进行浮点运算时会向上转换为double

第二个片段相当于:

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

因此,您必须将结果强制转换回(byte)以使编译器接受赋值。

someVar = (byte) (someVar - 3);

答案 1 :(得分:11)

这是CLI规范(Ecma 335)中的表的副本,它指定哪些操作数对类型A op B的二进制数字运算符有效,其中A和B是操作数,“op”是运算符,喜欢你在你的代码片段中使用的Opcodes.Sub:

alt text

这需要一些注释:

  • “native int”是C#程序中的IntPtr
  • F 表示C#
  • 中的浮点类型,double或float
  • & 表示指针值,方框是阴影,因为它们是不安全的操作
  • O 表示对象引用
  • x 是不允许的操作。

注意 F 的行和列,两个操作数必须是浮点数,你不能直接添加,比如说,一个int为double。 C#编译器通过自动将int操作数转换为double来处理该限制,以便操作符有效。

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

现在,这就是问题:结果是int32但是将其返回到字节值需要缩小转换。从32位到8位。这是麻烦,因为它失去了重要的一点。 C#编译器要求您明确说明。你基本上承认你知道你正在做什么,并且你知道这可能是令人惊讶的结果。像这样:

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

- =运算符是一个问题,因为没有有效的方法来应用所需的强制转换。它在语言语法中是不可表达的。使用(byte)3没有意义,无论如何都要将文字转换为int32以使运算符工作。

他们抨击了这个问题,编译器会在没有你帮助的情况下自动发出演员阵容。

相关问题