C# VB.NET和C之间的二进制移位差异#

C# VB.NET和C之间的二进制移位差异#,c#,.net,vb.net,bit-manipulation,vb.net-to-c#,C#,.net,Vb.net,Bit Manipulation,Vb.net To C#,我刚刚在翻译一些数据时发现了一个有趣的问题: VB.NET:CByte(4)根据byte没有在C#中应用相同的内容,您将使用 static byte LeftShiftVBStyle(byte value, int count) { return (byte)(value << (count & 7)); } 静态字节LeftShiftVBStyle(字节值,int计数) { 返回(字节)(valueChris已经搞定了,vb.net已经为字节和短类型定义了移位运算

我刚刚在翻译一些数据时发现了一个有趣的问题:

VB.NET:
CByte(4)根据byte没有在C#中应用相同的内容,您将使用

static byte LeftShiftVBStyle(byte value, int count)
{
    return (byte)(value << (count & 7));
}
静态字节LeftShiftVBStyle(字节值,int计数)
{

返回(字节)(valueChris已经搞定了,vb.net已经为字节和短类型定义了移位运算符,而C#没有。C#规范与C非常相似,并且与操作码的MSIL定义非常匹配。Shl、Shr和Shr#Un,它们只接受int32、int64和intptr操作数。因此,任何字节或短大小的操作数都首先转换为int32及其隐式转换

这是vb.net编译器必须处理的一个限制,它需要生成额外的代码,以使特定于字节和简短的运算符版本正常工作。字节运算符的实现方式如下:

Dim result As Byte = CByte(leftOperand << (rightOperand And 7))

Dim结果为Byte=CByte(LeftOperator这是一个有趣的区别,但是你真的需要一个字节上的换行行为吗?修改使用它的代码应该很容易;我熟悉32/64位c#的换行,但没有意识到VB将这个比喻进一步推广到字节上的8位换行。好奇!@MarcGravel:看起来像这只是因为C语言不使用字节或短裤,而是隐式地将它们转换成int型。我想在VB中,这个想法是正确的,但是我怀疑它与C++如何定义操作符或定义C语言思维的东西有关(请参阅我对源链接的回答)。.1,这是一个好问题。而C#约定很可能源于x86处理移位的方式。还有一个例子,在时间的黎明,一个愚蠢的设计决定永远存在。@Code-时间的黎明可能始于肯·汤普森的PDP-8。vb.net方式实际上与x86移位高度兼容,它可以处理字节和短大小的registers.我无法决定接受哪一个,所以我选择了第一个得到回答的答案,这三个答案都很好。C之所以这么做,似乎是因为C是这样做的(C#规范在很大程度上是以C为模型的),而VB.NET做的不同是因为VB做的不同,至于VB为什么这样做,原因可能不清楚或不清楚。虽然它们都编译为.NET CLR,但它们是非常不同的语言,所以这只是另一件需要注意的事情,沿边数组长度(和其他)。
Dim result As Short = CShort(leftOperand << (rightOperand And 15))
Dim result As Integer = CInt(leftOperand) << CInt(rightOperand)