C# 无符号短字符上的左移位,不溢出为整数
如果我有一个ushort变量,它是0xFFAA,我会用8位左移,我会得到一个整数,而不是一个无符号的短整数,为什么? 下面是一张让你更清楚的图片,我的意思是:C# 无符号短字符上的左移位,不溢出为整数,c#,bit-manipulation,overflow,bit-shift,C#,Bit Manipulation,Overflow,Bit Shift,如果我有一个ushort变量,它是0xFFAA,我会用8位左移,我会得到一个整数,而不是一个无符号的短整数,为什么? 下面是一张让你更清楚的图片,我的意思是: 有没有一种方法可以在不将int转换为无符号短字符的情况下从左移位获取16位变量?如果要确保只设置变量的较低16位,可以使用逻辑AND使用0xFFFF屏蔽: var supposed = (test << 8) & 0xFFFF; var=(测试可能与UINT不是CLS的一部分有关?UInt16类型不符合CLS。符合
有没有一种方法可以在不将int转换为无符号短字符的情况下从左移位获取16位变量?如果要确保只设置变量的较低16位,可以使用逻辑AND使用
0xFFFF
屏蔽:
var supposed = (test << 8) & 0xFFFF;
var=(测试可能与UINT不是CLS的一部分有关?UInt16类型不符合CLS。符合CLS的替代类型是Int32。Int16可以用来替换范围从零到最大值的UInt16值。有关CLS符合性的更多信息,请参阅公共语言规范。
test
在这里不是一个ushort;它是一个int
var
用整型常量键入总是会得到int
。即使没有C#的轮班升级规则,也没有理由期望输出ushort
。如果我用ushort而不是var,也会发生同样的情况。这是一个与你问的问题不同的问题,并且答案很简单,来自C#的类型提升规则。u的输出说明了我混淆的原因很简单。我来自低级编程。如果我左移到寄存器中,问题不会出现,字节(在我的示例中为0xFF)将被“删除”。因此,您的cow示例不在这里,因为您可以执行我解释的操作,而无需在低级别进行强制转换。但您回答了我的问题,原因是C#。谢谢,您的解决方案是aspected。您可以告诉我,为什么我的方法不按预期工作吗?正如用户5090812所述,test是一个int,因此将其向上移动8位会得到0x00FFAA00。指定具有4位数字的十六进制常量值不会使测试成为ushort。