C# C语言中最快的UInt32到int转换#

C# C语言中最快的UInt32到int转换#,c#,bit-manipulation,int,uint32,C#,Bit Manipulation,Int,Uint32,我有一个快速位级例程,它计算一个值,并返回一个UInt32。我需要将此值存储在SQL Server中的32位int字段中。我不想增加字段的大小,只想将此函数中的“字节”存储到int字段中 一次请求数百条记录,因此我需要在循环中将UInt32转换为int的最快方法。如果UInt32中设置了最左边的位,它应该设置int的符号位(或者做任何“可重复”的事情,但符号位可能是最简单的) 换句话说,我只希望UInt32的4个字节变成32位int的4个字节。我可以使用BitConverter类,但我不确定这是

我有一个快速位级例程,它计算一个值,并返回一个UInt32。我需要将此值存储在SQL Server中的32位int字段中。我不想增加字段的大小,只想将此函数中的“字节”存储到int字段中

一次请求数百条记录,因此我需要在循环中将UInt32转换为int的最快方法。如果UInt32中设置了最左边的位,它应该设置int的符号位(或者做任何“可重复”的事情,但符号位可能是最简单的)

换句话说,我只希望UInt32的4个字节变成32位int的4个字节。我可以使用BitConverter类,但我不确定这是最快的方法。使用这样一个未经检查的区域执行此操作是否会更快:

UInt32 fld = 4292515959;
unchecked {
    return (int)fld;
    // -2451337
}
我看到这里有人问了一个相反的问题,我只是想知道答案是否是相同的:


我认为未经检查的版本(如
未经检查((int)x)
)是最快的方法,因为没有方法调用。我不相信有更快的方法

顺便说一下,
UInt32
只是
uint
的另一个名称。。。就性能而言,走一条路与走另一条路是一样的,因此这与您发布的链接实际上是一样的


编辑:我记得我观察过一个基准测试的第一手实例,其中选中的
比未选中的
要快(不,这不是调试版本,而是经过优化的发布版本)。我不知道为什么会发生这种情况,但无论如何,不要认为通过打开溢出检查可以获得任何可测量的结果。

未选中((int)x)
只需要强制转换常量,选中和未选中会产生相同的结果(如果代码可以编译)

例如,此代码

uint data = 4292515959;
int uncheckedData;
int checkedData;
unchecked {
    uncheckedData = (int)data;
}
checkedData = (int)data;

Console.WriteLine(data);
Console.WriteLine(uncheckedData);
Console.WriteLine(checkedData);
生成此输出

4292515959 -2451337 -2451337 此代码(注意常量)无法编译(需要取消选中)

此代码也无法编译(需要取消选中)


这是一样的,你可以把C想象成带有安全检查的C。因此,如果您想将无符号int类型转换为int,只需使用类型转换。但首先用unchecked括起来,表示编译器不检查您的意图,否则会导致编译器向您发出错误,即赋值不兼容,不兼容意味着值的保真度可能会在转换中丢失(例如4292515959不再相同,变为负2451337(从计算机科学家的角度来看,它们是一样的[xkcd 541])谢谢Michael。如果你没有发表评论,我会立即投票将其作为答案。谢谢Lambert。这正是我需要的安慰。
uint data = 4292515959;
checkedData = (int)data;
const uint data = 4292515959;
checkedData = (int)data;
checkedData = (int)4292515959;