Tag: bit manipulation

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

我刚刚在翻译一些数据时发现了一个有趣的问题: CByte(4) << 8返回4 但是C#:( (byte)4 << 8返回1024 也就是说,为什么(CByte(4) << 8).GetType()返回类型{Name = “Byte” FullName = “System.Byte”} 然而C#: ((byte)4 << 8).GetType()返回类型{Name = “Int32” FullName = “System.Int32”} 有没有理由为什么这两个对待二进制移位是一样的? 接下来,是否有任何方法可以使C#位移与VB.NET相同(使VB.NET像C#一样执行CInt(_____) << 8 )?

在Visual Studio 2015中的符号扩展操作数上使用的按位或运算符

我刚刚尝试安装Visual Studio 2015,在尝试编译旧项目时,我收到了警告 CS0675按位或运算符用于符号扩展操作数; 首先考虑转换为较小的无符号类型 对于在Visual Studio 2013中编译时没有给出相同警告的代码片段。我发现重现所需的只是这个非常简单的代码: short a = 0; int b = 0; a |= (short)b; 现在,我已经阅读了这个问题 ,我已经阅读了Eric Lippert关于这个问题的博文 ,我很快就读到了符号扩展 ,但我的理解是当你从一个由较小数字组成的带符号数字类型进行转换时会发生符号扩展比特到具有更多比特数的比特,例如short到int 。 但是因为我从一个int为一个short ,所以如果我没有弄错的话,就不会发生任何符号扩展。 事实上,这不会在早期版本的Visual Studio中发出警告,这让我相信这必定是Visual Studio 2015编译器(Roslyn)中的一个错误。 我是否误解了符号扩展和/或编译器如何在这里工作,或者这很可能是编译器错误? 更新 Jon Skeet指出,实际上确实存在符号扩展,因为| 运算符未定义为short ,因此在将结果再次强制转换为short之前,会对int进行隐式转换。 但是,编译器不应该发出此警告,因为强制转换是无害的。 Roslyn编译器中存在一个错误,如接受的答案所述。