2

我有一个计算值并返回 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 按位转换为 UInt32 的最快方法?

4

2 回答 2

3

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

顺便说一句,UInt32这只是uint...的另一个名称。就性能而言,采用一种方式与采用另一种方式相同,所以这与您发布的链接实际上相同。


编辑:我记得亲眼观察过一个比checked更快unchecked的基准测试实例(不,它不是调试版本,而是带有优化的发布版本)。我不知道为什么会这样,但无论如何,不​​要认为通过打开溢出检查你会获得任何可衡量的东西。

于 2011-01-02T03:10:30.593 回答
1

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;
于 2019-03-20T07:36:15.450 回答