根据 MSDN 文章:https ://msdn.microsoft.com/en-us/library/8s682k58%28v=vs.80%29.aspx
一些编译器需要显式转换来支持缩小转换。
根据上述 msdn 链接中的陈述,可以肯定地说
将 int 转换为 uint 正在缩小转换范围
还,
将 uint 转换为 int 正在缩小转换范围
?
根据 MSDN 文章:https ://msdn.microsoft.com/en-us/library/8s682k58%28v=vs.80%29.aspx
一些编译器需要显式转换来支持缩小转换。
根据上述 msdn 链接中的陈述,可以肯定地说
将 int 转换为 uint 正在缩小转换范围
还,
将 uint 转换为 int 正在缩小转换范围
?
将整数或浮点类型从有符号转换为无符号(反之亦然)既不是缩小也不是扩大转换,因为用于存储它的位数保持不变。
相反,它是表示形式的变化,可以完全改变数字(例如,有符号的 -1 转换为无符号的 0xffffffff)。
事实上,如果你使用未经检查的算术:
unchecked
{
int x = -1;
uint y = (uint) x;
int z = (int) y;
Debug.Assert(x == z); // Will succeed for all x.
uint a = 0xffffffff;
int b = (int) a;
uint c = (uint) b;
Debug.Assert(a == c); // Will succeed for all a.
}
所以往返在两个方向上都有效,这证明在任何一个方向上都不会发生变窄。
缩小和扩大仅适用于整数和浮点类型,其中使用不同数量的位来存储数字的一个或多个部分。
但是,因为数字的值是可以改变的,所以必须强制转换才能进行这样的转换,以确保不会意外进行。
它没有缩小,但你仍然必须是明确的。两者都可以保存另一个没有的值。int
可以保存负值,uint
不能也uint
可以保存大于 2147483647 的值,这是 a 的最大值int
。
但是,两者都int
使用uint
32 位(= 4 字节)来保存信息。
当您将 a 转换int
为 abyte
时,您将丢失信息,因为 abyte
只能保存 8 位。在和
之间进行转换不会丢失任何位,但这些位具有不同的含义。(在 50% 的情况下)
您必须明确说明您知道自己在做什么。它将防止由隐式强制转换引起的错误。int
uint