我有一个计算值的快速位级例程,并返回一个UInt32。我需要将此值存储在SQL Server中的32位int字段中。我不想增加字段的大小,只想将此字段的“字节”存储在int字段中。
一次请求数百条这样的记录,因此我需要以最快的方式将UInt32转换为循环中的int。如果在UInt32中设置了最左边的位,它应该设置int的符号位(或者做任何“可重复的”,实际上,但符号位可能是最简单的。)
换句话说,我只想让UInt32的4个字节成为32位int的4个字节。我可以使用BitConverter类,但我不确定这是最快的方法。使用这样的未经检查的区域来执行此操作会更快:
UInt32 fld = 4292515959;
unchecked {
return (int)fld;
// -2451337
}
我看到这里已经提出了相反的问题,并且只是想知道答案是否会相反:
答案 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;