C#短整型位运算 - 为什么要转换成整型?

7
short BitwiseTest(short value)
{
    short test1 = ((value >> 8) & 0xFF);
    short test2 = unchecked((short)((value << 8) & 0xFF00));
    return (test1 | test2);
}

上述代码是一个(低效的)例子,用于在C#中交换short(有符号16位整数)的字节序。但是,上述代码将无法编译,因为C#在以下两行中都会隐式地将short转换为int:
第一种情况:
short test1 = ((value >> 8) & 0xFF);

第二种情况:
return (test1 | test2);

为什么要进行这个转换?如果将其转换回short,是否能够达到预期的结果?像这样:

short BitwiseTest2(short value)
{
    short test1 = (short)((value >> 8) & 0xFF);
    short test2 = unchecked((short)((value << 8) & 0xFF00));
    return ((short)(test1 | test2));
}

如果不这样做会有什么问题呢?

请注意,我理解为什么C#在执行左位移时将short类型转换为整数,因此对test2变量进行了赋值。


我没有投票关闭为重复,但这与https://dev59.com/n3NA5IYBdhLWcg3wfN6O显著相似。 - Jon Skeet
也许我应该解释一下为什么我认为现有关于加法的问题答案不相关。在加法中存在溢出的可能性,就像在test2的赋值中一样。我理解这些情况。然而,在我概述的两种情况中,不存在溢出的可能性。 - Benjamin Dobell
1个回答

0

那个问题根本不一样,也没有被标记为已回答。 - Benjamin Dobell
1
@Benjamin:只是作为参考,原问题提出者没有选择接受答案并不意味着它没有被回答。很多人似乎从来没有时间去做这件事,或者他们不明白应该这么做。通常情况下,你可以通过社区给某个答案投票的数量来更好地判断它的质量,而不是看它是否被接受。 - Cody Gray
1
那个答案的重要部分是它谈到所有短操作最终都变成了 int。正如我所说,问题不同,但答案基本上是相同的。short <someoperator> short 等于 int。 - Øyvind Bråthen
@Cody Gray:这是一个非常有价值的观点。我应该阐述一下,在所引用的问题中提出的答案背后给出的推理在这里不适用。 - Benjamin Dobell
@Benjamin - 顺便说一下,如果“not even remotely the same”等同于“quite different”,那么我想我们达成了一致 ;) - Øyvind Bråthen
@Øyvind Knobloch-Bråthen:抱歉造成了困惑。我不仅是指参考问题的作者所使用的措辞不同。我指的是“Stackoverflow对于问题的概念不同”,也就是说,答案、评论等与这个问题无关。除了两个问题都在讨论C#语法细节之外,没有其他相似之处。 - Benjamin Dobell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接