字节+字节=int…为什么?

字节+字节=int…为什么?

看看这个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数组)更快(因为缓存命中)。但是广泛的字节转换在代码中传播,使得它更加不可读。


qq_花开花谢_0
浏览 791回答 3
3回答

繁华开满天机

代码片段的第三行:byte&nbsp;z&nbsp;=&nbsp;x&nbsp;+&nbsp;y;实际上意味着byte&nbsp;z&nbsp;=&nbsp;(int)&nbsp;x&nbsp;+&nbsp;(int)&nbsp;y;因此,没有对字节的+操作,首先将字节转换为整数,而两个整数的加法结果是一个(32位)整数。

HUX布斯

就“为什么会发生”而言,这是因为C#为算术定义的任何运算符都没有字节、短或ushort,就像其他人所说的那样。这个答案是关于为什么那些操作符没有定义。我相信这基本上是为了表演。处理器可以快速完成32位的本地运算。自动将结果转换为字节。能如果你真的不想那样做的话,就会导致性能上的损失。

开心每一天1111

I 思想我以前在某个地方见过这个。假设我们生活在一个幻想的世界里,对“字节”的操作导致了“字节”。byte b = 32;byte c = 240;int i = b + c; // what is i?在这个幻想的世界里,我的价值将是16岁!为什么?因为+操作符的两个操作数都是字节,所以“b+c”的和被计算为一个字节,这导致整数溢出导致16。(正如我前面提到的,整数溢出是新的安全攻击向量。)编辑雷蒙德实际上是在捍卫C和C+最初采用的方法。在评论中,他为C#采取同样的方法辩护,理由是语言向后兼容。
打开App,查看更多内容
随时随地看视频慕课网APP