我试图编译这段代码:
Int64 itag = BitConverter.ToInt64(temp, 0);
itag &= 0xFFFFFFFFFFFFFC00;
然而,这给了我以下错误:
运算符'& ='不能应用于'long'和'ulong'类型的操作数
我该怎么做?
答案 0 :(得分:4)
请参阅http://msdn.microsoft.com/en-en/library/aa664674%28v=vs.71%29.aspx。
如果文字没有后缀,则它具有可以表示其值的第一种类型:
int
,uint
,long
,ulong
。< / p>
你有
0xFFFFFFFFFFFFFC00
但是Int64.Max是:
0x7FFFFFFFFFFFFFFF
所以long
不够大,ulong
被视为文字的类型。
现在左侧有一个Int64
,已签名,右侧有ulong
,但&=
没有超载接受该组合,这会导致错误。
答案 1 :(得分:3)
C#对整数文字使用最小的拟合类型,而0xFFFFFFFFFFFFFC00太长,所以它是一个ulong。
因此要么将itag转换为ulong,要么将0xFFFFFFFFFFFFFC00转换为long(未选中)。
答案 2 :(得分:1)
有符号和无符号的“数字”不能混合匹配,而且Int64已经签名,所以它是禁止的。
我会这样:
UInt64 itag = BitConverter.ToUInt64(temp, 0); //note the added 'U' to make it unsigned
itag &= 0xFFFFFFFFFFFFFC00; //Now types match, they're both unsigned.
答案 3 :(得分:1)
itag
很长。 0xFFFFFFFFFFFFFC00
是一个ulong。您试图在&=
语句中混合两种语句,但这不起作用。
为什么你的文字是ulong? MSDN says:
如果文字没有后缀,则它具有这些类型中的第一个,其值可以表示为:int,uint,long,ulong。
由于数字对于int,uint或long来说太大,你的文字就变成了一个ulong。
您有两种选择:将itag
声明为ulong,如其他人所建议的那样,或者(按位)将您的文字转换为long:
itag &= unchecked((long)0xFFFFFFFFFFFFFC00);
这会使你的ulong溢出到(负)长。
答案 4 :(得分:1)
C#语言规范的第7.11.1节整数逻辑运算符读取:
预定义的整数逻辑运算符为:
int operator&amp;(int x,int y);
uint operator&amp;(uint x,uint y);
长算子&amp;(长x,长y);
ulong operator&amp;(ulong x,ulong y);
如您所见,long
(只是Int64
的别名)和ulong
之间没有预定义的运算符,因此出错。
答案 5 :(得分:0)
问题在于您尝试&=
long
和 ulong
。
只需将Int64
替换为ulong
即可解决问题,因为您正在将&=
应用于2 ulong
。