根据MSDN文章:https://msdn.microsoft.com/en-us/library/8s682k58%28v=vs.80%29.aspx
某些编译器需要进行显式转换以支持缩小范围 转换..
基于上述msdn链接中的陈述,可以安全地说
将int转换为uint正在缩小转换
另外,
将uint转换为int正在缩小转换
答案 0 :(得分:1)
将积分或浮点类型从有符号转换为无符号,反之亦然,既不是缩小也不是扩展转换,因为用于存储它的位数保持不变。
相反,它是表示的更改,可以完全改变数字(例如,signed -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.
}
因此往返双向工作,证明在任何一个方向都不会发生变窄。
缩小和扩展仅适用于积分和浮点类型,其中使用不同数量的位来存储数字的一个或多个部分。
但是,由于数字的值可以更改,因此您必须进行转换以进行此类转换,以确保您不会意外地执行此操作。
答案 1 :(得分:1)
它并没有缩小,但你必须仍然是明确的。两者都可以保持另一个没有的价值。 int
可以保留负值,uint
可以&{39}和uint
可以保存大于2147483647的值,这是int
的最大值。
但是,int
和uint
都使用32位(= 4个字节)来保存信息。
当您将int
转换为byte
时,您将丢失信息,因为byte
只能容纳8位。
在int
和uint
之间转换并不会丢失任何位,但这些位具有不同的含义。 (在50%的情况下)
你必须明确表示你知道自己在做什么。它将防止由隐式演员引起的错误。