0

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

一些编译器需要显式转换来支持缩小转换。

根据上述 msdn 链接中的陈述,可以肯定地说

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

还,

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

?

4

2 回答 2

1

将整数或浮点类型从有符号转换为无符号(反之亦然)既不是缩小也不是扩大转换,因为用于存储它的位数保持不变。

相反,它是表示形式的变化,可以完全改变数字(例如,有符号的 -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.
}

所以往返在两个方向上都有效,这证明在任何一个方向上都不会发生变窄。

缩小和扩大仅适用于整数和浮点类型,其中使用不同数量的位来存储数字的一个或多个部分。

但是,因为数字的值是可以改变的,所以必须强制转换才能进行这样的转换,以确保不会意外进行。

于 2015-02-19T15:31:11.840 回答
1

它没有缩小,但你仍然必须是明确的。两者都可以保存另一个没有的值。int可以保存负值,uint不能也uint可以保存大于 2147483647 的值,这是 a 的最大值int

但是,两者都int使用uint32 位(= 4 字节)来保存信息。
当您将 a 转换int为 abyte时,您将丢失信息,因为 abyte只能保存 8 位。在和
之间进行转换不会丢失任何位,但这些位具有不同的含义。(在 50% 的情况下) 您必须明确说明您知道自己在做什么。它将防止由隐式强制转换引起的错误。intuint

于 2015-02-19T15:32:35.320 回答