为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
qq_花开花谢_0 2019-06-26 16:01:11
字节+字节=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 = intlong + long = longfloat + float = floatdouble + double = double所以为什么不:byte + byte = byteshort + short = short?一些背景:我正在对“小数字”(即<8)执行一长串计算,并将中间结果存储在一个大数组中。使用字节数组(而不是int数组)更快(因为缓存命中)。但是广泛的字节转换在代码中传播,使得它更加不可读。
查看完整描述

3 回答

?
繁华开满天机

TA贡献1816条经验 获得超4个赞

代码片段的第三行:

byte z = x + y;

实际上意味着

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

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


查看完整回答
反对 回复 2019-06-26
?
HUX布斯

TA贡献1876条经验 获得超6个赞

就“为什么会发生”而言,这是因为C#为算术定义的任何运算符都没有字节、短或ushort,就像其他人所说的那样。这个答案是关于为什么那些操作符没有定义。

我相信这基本上是为了表演。处理器可以快速完成32位的本地运算。自动将结果转换为字节。如果你真的不想那样做的话,就会导致性能上的损失。


查看完整回答
反对 回复 2019-06-26
?
开心每一天1111

TA贡献1836条经验 获得超13个赞

思想我以前在某个地方见过这个。

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

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

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

编辑雷蒙德实际上是在捍卫C和C+最初采用的方法。在评论中,他为C#采取同样的方法辩护,理由是语言向后兼容。


查看完整回答
反对 回复 2019-06-26
  • 3 回答
  • 0 关注
  • 790 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信