【发布时间】:2014-08-14 18:10:50
【问题描述】:
我试图确认一些关于缩小强制转换在 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);
没有区别。我已经使用从short 到ushort 的显式缩小转换完成了这个精确的实验,shortVal 的值在Int16.MinValue 到Int16.MaxValue 的范围内。所有 2^16 个案例都可以正常检查。但是,实际解释的值自然会被重新解释,因为字节保持不变。我假设有符号整数类型使用二进制补码来表示有符号值(这是真的吗?)
我需要知道,我是否可以指望这些转换始终是“字节安全的”——例如不更改底层字节及其顺序。这也适用于从无符号到有符号的另一种转换。这些转换是否彼此完全相反?我主要关注 short/ushort 和 int/uint。但所有整数类型都值得关注。
这些细节可能取决于 C# 和 CLR 背后的技术的实现。我在这里严格关注适用于 Windows 32/64 位的 CLR。
【问题讨论】:
-
是的。 C# 有符号整数类型使用二进制补码表示。
标签: c# casting type-conversion