C#中最快的UInt32到int转换

时间:2011-01-02 03:08:43

标签: c# bit-manipulation int uint32

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

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

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

UInt32 fld = 4292515959;
unchecked {
    return (int)fld;
    // -2451337
}

我看到这里已经提出了相反的问题,并且只是想知道答案是否会相反:

Fastest way to cast int to UInt32 bitwise?

2 个答案:

答案 0 :(得分:3)

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

顺便说一句,UInt32只是uint的另一个名称...单向一致就是在性能方面走另一条路,所以这与你的链接真的相同帐。


编辑:我记得第一手观察基准的一个实例,其中checked 比<{1>} 更快(不,它不是调试构建,它是一个优化的发布版本)。我不知道为什么会发生这种情况,但无论如何,不​​要以为你可以通过转换溢出检查来获得任何可衡量的东西。

答案 1 :(得分:0)

unchecked((int)x)仅需要强制转换const,并且选中和未选中都会产生相同的结果(如果代码可以编译)。

例如此代码

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

为简洁起见,可以编译此代码(与unchecked((int)data)相同的结果)

uint data = 4292515959;
checkedData = (int)data;

此代码(请注意const)无法编译(要求未选中)

const uint data = 4292515959;
checkedData = (int)data;

此代码也无法编译(要求未选中)

checkedData = (int)4292515959;