字节+字节=整数...为什么?
看看这个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