字节+字节=整数...为什么?

看看这个C#代码:

byte x = 1;
byte y = 2;
byte z = x + y; // ERROR: Cannot implicitly convert type 'int' to 'byte'

byte (或short )类型上执行的任何数学运算的结果都隐含地转换回整数。 解决方案是显式将结果转换回一个字节:

byte z = (byte)(x + y); // this works

我想知道的是为什么? 它是建筑吗? 哲学?

我们有:

  • int + int = int
  • long + long = long
  • float + float = float
  • double + double = double
  • 那么为什么不呢:

  • byte + byte = byte
  • short + short = short
  • 有点背景:我正在对“小数字”(即<8)进行一长串计算,并将中间结果存储在一个大数组中。 使用字节数组(而不是int数组)会更快(因为缓存命中)。 但是,通过代码传播的大量字节数据使其更难读。


    代码片段的第三行:

    byte z = x + y;
    

    实际上是指

    byte z = (int) x + (int) y;
    

    因此,对字节没有+操作,字节首先被转换为整数,并且两个整数相加的结果是一个(32位)整数。


    就“为什么会发生这种情况而言”,这是因为没有任何由C#定义的运算符用于像byte,sbyte,short或ushort这样的算术运算,就像其他人所说的那样。 这个答案是关于为什么这些运营商没有定义。

    我相信这基本上是为了表现。 处理器具有本地操作,可以非常快速地进行32位运算。 自动完成从结果到字节的转换可以完成,但在实际上不需要这种行为的情况下会导致性能损失。

    我认为这是在注释的C#标准之一中提到的。 看着...

    编辑:令人烦恼的是,我现在已经通过注释的ECMA C#2规范,注释的MS C#3规范和注释CLI规范进行了翻阅,并且他们都没有提到这一点,据我所知。 我确信我已经看到了上面给出的原因,但是如果我知道在哪里,我会受到打击。 道歉,参考粉丝:(


    我以为我曾经在某个地方见过这个。 从这篇文章中,旧的新事物:

    假设我们生活在一个幻想的世界里,对'字节'的操作导致'字节'。

    byte b = 32;
    byte c = 240;
    int i = b + c; // what is i?
    

    在这个幻想的世界里,我的价值将是16! 为什么? 因为+运算符的两个操作数都是字节,所以总和“b + c”被计算为一个字节,由于整数溢出,结果为16。 (如前所述,整数溢出是新的安全攻击向量。)

    编辑 :雷蒙德本质上是捍卫C和C ++原本的方法。 在评论中,他基于语言向后兼容性的理由捍卫C#采用相同方法的事实。

    链接地址: http://www.djcxy.com/p/3577.html

    上一篇: byte + byte = int... why?

    下一篇: Create Generic method constraining T to an Enum