C#LearningTutorial:C#XORoftwobytevariableswithoutacastwillnotcompile转换为'字节':字节a=25;字节b=60;字节c=a^b;如果我使用算术运算符,这将是有意义的,因为a+b的结果可能大于结果可以存储在单个字节中。但是,将其应用于XOR运算符没有任何意义。这是一个从不溢出字节的按位运算。在两个操作数周围使用转换器:bytec=(byte)(a^b);我不能给你一个理由,但我可以告诉你为什么编译器有这种行为(这可能并不像你知道的那样有趣)。来自旧版本的C#规范(我应该下载更新的版本),着重添加:14.2.6.2BinaryNumberPromotions此条款是提供信息的。对于预定义的+,?的操作数发生二进制数字提升?,*,/,%,&,|,^,==,!=,>,,>=和二元运算符。二进制数字提升将两个操作数隐式转换为通用类型,在非关系运算符的情况下,该类型也成为操作的结果类型。二进制数字提升包括按照它们在此处出现的顺序应用以下规则:因此,对于这些运算符,基本上小于int的操作数将转换为int(对于非关系运算,结果将是int)。我说我不能给你理由;但是,我会猜测-我认为C#的设计者希望确保缩小时可能丢失信息的操作需要让程序员以强制转换的形式显式缩小操作。例如:字节a=200;字节b=100;字节c=a+b;//值将被截断尽管在两个字节操作数之间执行异或运算时不会发生这种截断,但我认为语言设计者可能不希望有一组更复杂的规则,其中一些操作需要显式转换而另一些则不需要。只是一个小提示:上面的引用是“信息性的”而不是“规范性的”,但它以易于阅读的形式涵盖了所有案例。严格来说(在规范意义上),^运算符以这种方式运行的原因是因为在处理字节操作数时最接近的运算符重载是(来自14.10.1“整数逻辑运算符”):intoperator^(intx,诠释y);因此,正如信息文本所解释的那样,操作数被提升为int并产生int结果。微软的神级程序员有一个答案:http://blogs.msdn.com/oldnewthing/archive/2004/03/10/87247.aspx也许更多的是关于编译器设计。它们通过概括编译过程使编译器更简单,它不必查看操作数的运算符,因此它将按位运算与算术运算符归为同一类别。由此,完成了类型扩展。我猜这是因为运算符XOR是为布尔值和整数定义的。而结果从整数结果到字节的转换是信息丢失转换;因此需要显式转换(程序员点头)。这更多地与CLI规范中隐式和显式转换的规则有关。整数(int=System.Int32=4字节)比一个字节宽(显然是1个字节!)。因此,从int到byte的任何转换都可能是收缩转换。所以编译器希望你明确说明这一点。我想我记得一个关于这个的热门问题。byte+byte=int...为什么?这似乎是因为在C#语言规范中它被定义为Integer和Longhttp://msdn.microsoft.com/en-us/library/aa691307%28v=VS.71%29.aspx所以,实际上发生了什么诀窍是编译器隐式地将字节操作数转换为整数,因为这样就不会丢失数据。但是结果(即int)不能在不丢失数据的情况下(隐含地)降级。所以,你需要明确地告诉编译器你知道你在做什么!至于为什么非要将两个字节转换成整数才能异或?如果你想深究的话,CLI规范(第一部分)的12.1.2描述了这样一个事实,即在计算堆栈上,只能存在int或long。在评估期间,必须扩展所有较短的总体类型。不幸的是,我找不到直接指向CLI规范的合适链接——我有一个PDF格式的本地副本,但不记得我从哪里得到的。FWIW字节a=25;字节b=60;a=a^b;不起作用。但是字节a=25;字节b=60;^=b;确实有效。以上就是C#学习教程:两个字节变量的C#异或不强制转换将无法编译的全部内容分享。如果对大家有用,需要进一步了解C#学习教程,希望大家多多关注---本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
