C#有符号和无符号整数是否都是Narrowing转换?

时间:2015-02-19 15:13:58

标签: c# c#-4.0 type-conversion narrowing

根据MSDN文章:https://msdn.microsoft.com/en-us/library/8s682k58%28v=vs.80%29.aspx

  

某些编译器需要进行显式转换以支持缩小范围   转换..

基于上述msdn链接中的陈述,可以安全地说

将int转换为uint正在缩小转换

另外,

将uint转换为int正在缩小转换

2 个答案:

答案 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的最大值。

但是,intuint都使用32位(= 4个字节)来保存信息。
当您将int转换为byte时,您将丢失信息,因为byte只能容纳8位。
intuint之间转换并不会丢失任何位,但这些位具有不同的含义。 (在50%的情况下)
你必须明确表示你知道自己在做什么。它将防止由隐式演员引起的错误。