关于在有符号和无符号整数类型之间缩小C#中的强制转换

时间:2014-08-14 18:10:51

标签: c# casting type-conversion

我试图在C#(5.0,.NET Framework 4.0 / 4.5)中使用整数类型缩小转换的方式得到一些证实。结论:在签名和未签名之间进行转换时,我能否确定整数类型的基础字节在顺序和值上保持不变?

让我们说我做了以下事情:

short shortVal = -20000;
ushort ushortVal = (ushort)shortVal;

现在,我到目前为止所做的实验向我展示了以下两个字节数组中的字节:

byte[] shortBytes = BitConverter.GetBytes(shortVal);
byte[] ushortBytes = BitConverter.GetBytes(ushortVal); 

不要有所不同。我已经完成了这个确切的实验,从shortushort进行了明确的缩小演员,其值shortValInt16.MinValueInt16.MaxValue的范围内。所有2 ^ 16个案件都罚款。然而,实际解释的值自然会被重新解释,因为字节保持不变。我假设有符号整数类型使用两个补码来表示有符号值(这是真的吗?)

我需要知道,如果我可以指望这些转换始终是"字节安全" - 因为没有改变底层字节及其顺序。这也适用于从无符号到签名的转换。这些转换是否完全相反?我主要关注short / ushort和int / uint。但所有整体类型都很有意义。

这些细节可能取决于C#和CLR背后的技术的实现。我在这里严格关注Windows 32/64位的CLR。

1 个答案:

答案 0 :(得分:2)

这可能非常棘手。

CLR确实在x86 / x64体系结构上使用了两个补码来表示有符号整数表示(正如您在测试中所观察到的那样),并且在不久的将来它不太可能发生变化,因为体系结构本身对它有很好的支持。可以肯定它会在这段时间内保持这种状态。

另一方面,我没有在CLI或C#规范中找到任何提及,所以你不能指望它,特别是面对其他架构和/或CLI实现。

所以这取决于你想要使用它的内容。如果可能的话,我会远离这样的实现细节,并使用更高级别的序列化工具来转换为/来自任何二进制表示。

相关问题