【问题标题】:Fastest UInt32 to int conversion in C#C# 中最快的 UInt32 到 int 的转换
【发布时间】:2011-01-02 03:08:43
【问题描述】:

我有一个快速的位级例程,它计算一个值并返回一个 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?

【问题讨论】:

  • 同理,你可以把C#想象成带有安全检查的C。因此,如果要将 unsigned int 类型转换为 int,只需使用类型转换。但是首先用 unchecked 括起来,表示编译器不要检查您的意图,不这样做会导致编译器向您提出分配不兼容的错误,通过不兼容,这意味着值的保真度可能会在翻译中丢失(例如 4292515959 不再相同,变为负数 2451337(从计算机科学家的角度来看它们是相同的 [xkcd 541]))
  • 谢谢迈克尔。如果您没有对此发表评论,我会立即投票作为答案。

标签: c# bit-manipulation int uint32


【解决方案1】:

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

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


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

【讨论】:

  • 谢谢兰伯特。正是我需要的安慰。
【解决方案2】:

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;

【讨论】:

    猜你喜欢
    • 2011-04-05
    • 2014-10-24
    • 2016-02-17
    • 1970-01-01
    • 2017-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-02-17
    • 1970-01-01
    相关资源
    最近更新 更多