在C中,我认为这三种说法都是相同的。
我错过了什么演员?
供参考,完整的功能:
public UInt16 read_word(byte addr, byte cmd, string descr = "")
{
byte[] w = { cmd };
byte[] r = read_write(addr, w, 2);
// I can't figure out why the compiler rejects this statement:
// return (UInt16)(r[1] << 8) | (UInt16)(r[0]);
UInt16 ret = r[0];
// The compiler also rejects this:
// ret = ret | (UInt16)(r[1] << 8);
// But, the compiler accepts this:
ret |= (UInt16)(r[1] << 8);
return ret;
}
发布于 2014-01-24 02:45:52
它在c#规范中得到了描述:
4.1.5积分类型
+
、–
、*
、/
、%
、&
、^
、|
、==
、!=
、>
、<
、>=
和<=
操作符,操作数转换为T
,其中T
是int
、uint
、d24和d25的第一个操作数,可以完全表示两个操作数的所有可能值。然后使用T类型的精度来执行操作,结果的类型是T (或关系操作符的bool )。不允许一个操作数为long类型,另一个操作数为带有二进制运算符的ulong类型。
对于二进制<<和>>运算符,左操作数转换为T类型,其中T是int、uint、long和ulong中的第一个操作数,可以完全表示操作数的所有可能值。然后使用T类型的精度执行操作,结果的类型为T。
因此,当您试图在<<上执行UInt16时,它首先被转换为int,因为这是第一个能够完全表示UInt16的所有可能值的int。返回的值也是int。这就是为什么您必须再次将结果转换为UInt16的原因。
发布于 2014-01-24 02:30:32
在C#中,使用字节或短的按位运算符将导致隐式转换为int。
我认为以下几点是可行的:
return (UInt16)(r[1] << 8 | r[0]);
ret = (UInt16)(ret | (r[1] << 8));
发布于 2014-01-24 02:31:44
我认为问题在于|
运算符不是为Uint16
定义的。(MSDN说表示它只为整数类型和Uint16
是一个结构定义)所以我相信您在这一行中得到了类型提升:
ret |= (UInt16)(r[1] << 8);
返回到int
,然后在返回它时(从int
返回到UInt16
):
return ret;
https://stackoverflow.com/questions/21323128
复制相似问题