Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如果没有强制转换,两个字节变量上的C#异或将无法编译

如果没有强制转换,两个字节变量上的C#异或将无法编译
EN

Stack Overflow用户
提问于 2010-04-28 04:57:09
回答 7查看 39.9K关注 0票数 32

为什么下面的代码会引发编译时错误:‘无法将类型'int’隐式转换为'byte':

代码语言:javascript
运行
AI代码解释
复制
        byte a = 25;
        byte b = 60;

        byte c = a ^ b;

如果我使用算术c运算符,这将是有意义的,因为a+b的结果可能比单个字节中存储的要大。

但是,将其应用于XOR运算符是没有意义的。在这里,XOR是一个永远不会溢出一个字节的按位操作。

在两个操作对象周围使用强制转换有效:

代码语言:javascript
运行
AI代码解释
复制
byte c = (byte)(a ^ b);
EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2010-04-28 05:44:21

我不能给你理由,但是我可以从编译器必须遵循的规则(这可能不是你真正感兴趣的)的角度来解释为什么编译器会有这样的行为。

从C#规范的旧副本(我可能应该下载更新的版本)中,重点添加了:

14.2.6.2二进制数字促销此子句提供信息。

对预定义的+?*/%&|^==、D10、D11、D12、D13和D14二元运算符的操作数进行二进制数值提升。二进制数值提升隐式地将两个操作数转换为公共类型,对于非关系运算符,该类型也成为操作的结果类型。二进制数字升级包括按以下规则在此处出现的顺序应用这些规则:

如果其中一个操作数的类型为decimal,则为

  • ;如果另一个操作数的类型为float或double,则会发生编译时错误。
  • 否则,如果其中一个操作数的类型为double,则另一个操作数将转换为double类型。
  • 否则,如果其中一个操作数的类型为float,则另一个操作数转换为float类型。
  • 否则,如果其中一个操作数的类型为ulong,则另一个操作数将转换为ulong类型,否则,如果另一个操作数的类型为sbyte、short、int或long,则会发生编译时错误。
  • 否则,如果其中一个操作数的类型为long,则另一个操作数将转换为long类型。
  • 否则,如果其中一个操作数属于uint类型,而另一个操作数属于sbyte、short或int类型,则这两个操作数都将转换为long类型。
  • 否则,如果其中一个操作数属于uint类型,则另一个操作数将转换为uint类型。否则,两个操作数都将转换为int.

类型

因此,对于这些运算符,小于int的操作数基本上将被转换为int (对于非关系操作,结果将是int )。

我说过我不能给你一个理由;但是,我会猜测一下-我认为C#的设计者想要确保如果缩小可能会丢失信息的操作将需要由程序员以强制转换的形式显式地缩小操作。例如:

代码语言:javascript
运行
AI代码解释
复制
byte a = 200;
byte b = 100;

byte c = a + b;  // value would be truncated

虽然在两个字节操作数之间执行xor操作时不会发生这种截断,但我认为语言设计者可能不希望有一组更复杂的规则,其中一些操作需要显式强制转换,而另一些则不需要。

注意:上面的引用是“参考”而不是“规范”,但它以一种易于阅读的形式涵盖了所有的案例。严格地说(在标准意义上),^运算符如此行为的原因是因为在处理byte操作数时,该运算符的最接近重载是(来自14.10.1“整数逻辑运算符”):

代码语言:javascript
运行
AI代码解释
复制
int operator ^(int x, int y); 

因此,正如信息性文本所解释的那样,操作数被提升为int并产生int结果。

票数 27
EN

Stack Overflow用户

发布于 2010-04-28 05:10:10

来自微软的半神程序员有一个答案:http://blogs.msdn.com/oldnewthing/archive/2004/03/10/87247.aspx

也许它更多的是关于编译器设计的。它们通过泛化编译过程使编译器变得更简单,它不必查看操作数的运算符,因此它将按位运算集中在与算术运算符相同的类别中。因此,经历了类型扩展

链接已死,存档地址:

https://web.archive.org/web/20140118171646/http://blogs.msdn.com/b/oldnewthing/archive/2004/03/10/87247.aspx

票数 2
EN

Stack Overflow用户

发布于 2016-10-20 03:59:46

FWIW字节a= 25;字节b= 60;a=a^b;不起作用。然而,字节a= 25;字节b= 60;a ^= b;确实有效。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2726920

复制
相关文章
Python变量类型的强制转换
详细请参加http://www.runoob.com/python/python-variable-types.html 
py3study
2020/01/14
2K0
异或运算的巧用 → 不用额外的变量,如何交换两个变量的值?
  关于“位”运算,大家或多或少都知道点,比如与运算(&)、或运算(|)、异或运算(^)、取反运算(~)、左移(<<)、右移(>>)
青石路
2021/11/30
1.6K0
异或运算的巧用 → 不用额外的变量,如何交换两个变量的值?
将图像转换为JPG或GIF字节流。
其实这个东西真的没有什么可谈的,完全都是一堆API函数的调用,不过呢,隔那么一段时间就有人在那里问,而且一般也得不到正确的答案,因此,我还是画蛇添足,共享一下这些调用的苦力活吧。
用户1138785
2019/09/11
1.9K0
将图像转换为JPG或GIF字节流。
与运算(&)、或运算(|)、异或运算(^)、进制转换
例如:3|5 即 00000011 | 0000 0101 = 00000111,因此,3|5=7。 
全栈程序员站长
2022/09/02
7810
java的异或_java中的异或
异或是一种基于二进制的位运算,用符号XOR或者 ^ 表示,其运算法则是对运算符两侧数的每一个二进制位,同值取0,异值取1。
全栈程序员站长
2022/11/09
3.5K1
java的异或_java中的异或
使用异或实现大小写转换
  怎么看起来都差不多的,怎么就可以实现大小写转换了。大家先别急,我们看下ASCII字符码表。
Qt君
2023/03/17
1.1K0
使用异或实现大小写转换
java异或运算_异或校验
异或运算常用来做数据的简单校验。Java的实现:(将字节数组两两异或,返回最后异或值)
全栈程序员站长
2022/11/09
1.5K0
或 、与、异或
& 与 (都是1时,结果才为1) 表示按位与。 &表示按位与操作,我们通常使用0x0f来与一个整数进行&运算,来获取该整数的最低4个bit位,例如,0x31 & 0x0f的结果为0x01。 二进制与运算规则:1&1=1  1&0=0  0&0=0 | 或  (只要有1,那么就是1) 表示按位或 按位或运算 按位或运算符“|”是双目运算符。其功能是参与运算的两数各对应的二进位(也就是最后一位)相或。只要对应的二个二进位有一个为1时,结果位就为1。 ^ 异或 (只要一样结果就是0) 按
Lokinli
2023/03/09
9820
LeetCode 1442. 形成两个异或相等数组的三元组数目(前缀异或)
现需要从数组中取三个下标 i、j 和 k ,其中 (0 <= i < j <= k < arr.length) 。
Michael阿明
2020/07/13
4600
instanceof运算符&引用变量的强制类型转换
instanceof是Java语言中的一个二元运算符,它的作用是判断一个引用类型的变量所指向的对象是否是一个类(或接口、抽象类、父类)的实例,即它左边的对象是否是它右边的类的实例该运算符返回boolean类型的数据。
硕人其颀
2020/06/02
1.1K0
java异或运算符_python 异或
1. a ^ b = b ^ a   2. a ^ b ^ c = a ^ (b ^ c) = (a ^ b) ^ c;   3. d = a ^ b ^ c 可以推出 a = d ^ b ^ c.   4. a ^ b ^ a = b.
全栈程序员站长
2022/09/27
1.7K0
java异或运算符_python 异或
奶牛异或
奶牛异或 链接:https://ac.nowcoder.com/acm/problem/22998?&headNav=acm 来源:牛客网 题目描述 农民约翰在喂奶牛的时候被另一个问题卡住了。他的所
glm233
2020/11/03
1K0
c语言 按字节异或,C语言位数算,按位异或.只知道按位异或原理 不知道这题怎么做…
从键盘读入两个整数,对它们进行按位异或操作,把操作结果按二进制位放在字符数组str中,最后输出该字符串。提示:第2个空建议使用条件表达式(?表达式)实现!
全栈程序员站长
2022/09/05
8980
c语言 按字节异或,C语言位数算,按位异或.只知道按位异或原理 不知道这题怎么做…
异或和与运算_逻辑异或运算规则
异或,是一个数学运算符,英文为exclusive OR,缩写为xor,应用于逻辑运算。异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:
全栈程序员站长
2022/09/16
3.7K0
Java异或校验_异或校验计算器
今天要用到异或校验,折腾了半天,写下来留作备用。 功能是将一串16进制的数进行异或校验,输出校验和。 代码:
全栈程序员站长
2022/11/09
1.4K0
java中的异或运算符_java按位异或
第一种:用真实值计算 ^是异或运算符,异或的规则是转换成二进制比较,相同为0,不同为1. 一个数a与另一个数b异或的结果等于a^b,用结果( a^b)异或a,就会得到b; 上面的结果,我们用代码来验证。代码( a=a^b; b=a^b; a=a^b;)可以转换成二进制计算。
全栈程序员站长
2022/11/10
2K0
java中的异或运算符_java按位异或
【C/C++】异或操作巧妙实现两个数的交换操作
今天在看OpenGL加载TGA格式图像用作纹理的代码时,看到关于RGB(A)顺序转换的一行代码时,捉一开始感到很困惑,后来想了想,就是实现交换操作。
用户7886150
2021/02/08
5750
异或性质的应用
给你N个数,输出满足异或和是质数的子集个数(允许有重复元素),答案可能很大,输出模 1e9+7 后的结果。
luxuantao
2021/02/24
3870
java 异或加密_使用异或实现一个简单的加密或解密
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
1.4K0
LeetCode 1310. 子数组异或查询(前缀异或)
有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] = [Li, Ri]。
Michael阿明
2020/07/13
9570

相似问题

字节上的异或运算

11

需要帮助将c#异或转换为Java

11

单字节异或密码

10

c#在字节数组上应用64位异或

20

将异或转换为NOR

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档