【发布时间】: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
}
我看到这里提出了相反的问题,只是想知道答案是否相同:
【问题讨论】:
-
同理,你可以把C#想象成带有安全检查的C。因此,如果要将 unsigned int 类型转换为 int,只需使用类型转换。但是首先用 unchecked 括起来,表示编译器不要检查您的意图,不这样做会导致编译器向您提出分配不兼容的错误,通过不兼容,这意味着值的保真度可能会在翻译中丢失(例如 4292515959 不再相同,变为负数 2451337(从计算机科学家的角度来看它们是相同的 [xkcd 541]))
-
谢谢迈克尔。如果您没有对此发表评论,我会立即投票作为答案。
标签: c# bit-manipulation int uint32