Mif*_*Fox 22 c# byte operators
如果我有两个byte
小号a
和b
,怎么来的:
byte c = a & b;
Run Code Online (Sandbox Code Playgroud)
关于将byte转换为int会产生编译器错误?它这样做,即使我把一个显式类型转换前面a
和b
.
另外,我知道这个问题,但我真的不知道它是如何应用的.这似乎是一个返回类型的问题operator &(byte operand, byte operand2)
,编译器应该能够像任何其他运算符一样进行排序.
Mar*_*ers 24
为什么C#的按位运算符总是返回int而不管它们的输入格式如何?
我总是不同意.这是有效的,结果a & b
是long
:
long a = 0xffffffffffff;
long b = 0xffffffffffff;
long x = a & b;
Run Code Online (Sandbox Code Playgroud)
返回类型是不是int
如果参数中的一个或两个都是long
,ulong
或uint
.
为什么C#的按位运算符如果输入是字节则返回int?
结果byte & byte
是一个int,因为&
在字节上没有定义运算符.(来源)
&
存在一个运算符,int
并且还有一个隐式byte
转换,int
所以当你写byte1 & byte2
这个时,它实际上和写一样,((int)byte1) & ((int)byte2)
结果是一个int
.
Han*_*ant 15
这种行为是IL设计的结果,IL是所有.NET编译器生成的中间语言.虽然它支持短整数类型(byte,sbyte,short,ushort),但它们只有非常有限的操作数.加载,存储,转换,创建数组,就是这样.这不是偶然的,那些是你可以在32位处理器上有效执行的操作,当设计IL和RISC是未来时.
二进制比较和分支操作仅适用于int32,int64,native int,本机浮点,对象和托管引用.这些操作数在任何当前CPU内核上都是32位或64位,确保JIT编译器可以生成有效的机器代码.
您可以在Ecma 335,Partition I,第12.1章和第III部分,第1.5章中阅读更多相关信息
我在这里写了一篇关于此的更广泛的帖子.
没有为字节类型(等等)定义二进制运算符.实际上,所有二进制(数字)运算符仅对以下本机类型起作用:
如果涉及任何其他类型,它将使用上述之一.
对于预定义的+, - ,*,/,%,&,|,^,==,!=,>,<,> =和<=二元运算符的操作数,会发生二进制数字提升.二进制数字提升隐式地将两个操作数转换为公共类型,在非关系运算符的情况下,它也成为操作的结果类型.二进制数字促销包括按照它们在此处显示的顺序应用以下规则:
归档时间: |
|
查看次数: |
6998 次 |
最近记录: |