我在屏蔽 Int16 时遇到问题,C# 将掩码的高十六进制数 (65532d) 解释为 Int32。我见过很多例子,但它们要么有 UInt 要么使用友好的阳光低位掩码,不会干扰符号位,因此不需要转换/转换。如何让这两个数字相处融洽?看看下面的FFFC:
错误代码是: 错误 CS0266 无法将类型“int”隐式转换为“short”。存在显式转换(您是否缺少演员表?)
for (i = 0; i < nbrofsamples; i++) {
// bigbuffer[] contains a list of interlaced Int16 from up to 4 data channels
x = (i* SRecMeasPtrC.uNumCurves + SRecMeasPtrC.uCurveIndex) * sizeof(Int16);
intvalue = BitConverter.ToInt16(bigbuffer, x);
// intvalue's two lower bits are used for other stuff so I want to mask them away
intvalue = intvalue & 0xFFFC; // << ERROR! Meh! Hex masking works in C and in Delphi!
// and measvalue (a float) is calculated by applying a magic formula:
measvalue = Myvalue3(intvalue, CurrentKanalInfos[CurrentChannel], out iserr);
// and then I copy the float into an array (belonging to the channel) that can be plotted onscreen
Buffer.BlockCopy(BitConverter.GetBytes(measvalue), 0, Mymeasdata[CurrentChannel].curvebufferY, i * sizeof(Single), sizeof(Single));
}
编辑:现在,我收到了几个给出“为什么”但没有“如何”的答案的链接。一个(部分)答案是: “一个 & 运算符存在于 int 并且还有一个从 byte 到 int 的隐式转换,所以当你写 byte1 & byte2 这实际上与写 ((int)byte1) & (( int)byte2) 并且结果是一个 int。” 一个在这里长达一小时的答案给了我使用 -4 而不是 0xFFFC 的答案,我很感激这个解决方法。然而,更容易阅读的十六进制掩码“FFFC”必须在注释中,而不是在代码中。
所以这最终没有产生错误,所有括号都需要:
Int16 intvalue;
intvalue = (Int16)(((int)intvalue) & ((int)-4)) // -4 is my bitmask FFFC