在C#中将两个字节变量的加法结果分配给另一个字节变量产生错误,只能分配给int变量[duplicate]
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在C#中将两个字节变量的加法结果分配给另一个字节变量产生错误,只能分配给int变量[duplicate]相关的知识,希望对你有一定的参考价值。
这个问题在这里已有答案:
我有以下代码 -
using System;
namespace MyApp {
class Program {
static void Main() {
byte x = 10, y = 20;
Console.WriteLine(x.GetType());
Console.WriteLine(y.GetType());
//byte z = (x+y); Error: (9,14): error CS0266:
//Cannot implicitly convert type 'int' to 'byte'.
//An explicit conversion exists (are you missing a cast?)
byte z = (byte)(x+y);
Console.WriteLine(z.GetType());
Console.WriteLine(x);
Console.WriteLine(y);
Console.WriteLine(z);
}
}
}
输出:
System.Byte
System.Byte
System.Byte
10
20
30
但是如果使用byte z = x+y
而不是显式类型转换,它会产生错误 -
(9,14): error CS0266: Cannot implicitly convert type 'int' to 'byte'. An explicit conversion exists (are you missing a cast?)
但是如代码所示,编译器将x
和y
读为字节。
那么,为什么添加两个字节会产生需要显式类型转换的int?
这是Implicit Conversion的一个例子。
此链接进一步说明:
https://blogs.msdn.microsoft.com/oldnewthing/20040310-00/?p=40323
人们抱怨以下代码引发警告:
byte b = 32; byte c = ~b; // error CS0029: Cannot implicitly convert type 'int' to 'byte'
“对'byte'的操作结果应该是另一个'byte',而不是'int',”他们声称。
要小心你的要求。你可能不喜欢它。
假设我们生活在一个幻想世界中,'byte'上的操作导致'byte'。
byte b = 32; byte c = 240; int i = b + c; // what is i?
在这个幻想世界中,我的价值将是16!为什么?因为+运算符的两个操作数都是字节,所以总和“b + c”被计算为一个字节,由于整数溢出导致16。 (而且,正如我前面提到的,整数溢出是新的安全攻击向量。)
同样的,
int j = -b;
由于同样的原因,会导致j具有值224而不是-32。 ...在我们想象的世界中,一旦游戏总数超过255,此代码将返回不正确的结果。要修复它,您必须插入烦人的int强制转换。
return ((int)captain.Wins + cocaptain.Wins) >= ((int)captain.Games + cocaptain.Games) / 2;
因此,无论你如何切片,你都必须插入令人讨厌的演员阵容。也许安全方面的语言是错误的(强迫你在你知道溢出不是问题的地方插入演员表)而不是在沉默方面犯错误(在你的工资部门之前你可能不会注意到丢失的演员表)问你为什么他们的书在月底没有加起来)。
以上是关于在C#中将两个字节变量的加法结果分配给另一个字节变量产生错误,只能分配给int变量[duplicate]的主要内容,如果未能解决你的问题,请参考以下文章
为啥在Javascript中将一个对象分配给另一个变量也会改变初始对象[重复]