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.
}

したがって、往復は両方向で機能します。これは、どちらの方向にも狭小化が発生しないことを証明しています。

縮小と拡大は、数値の 1 つ以上の部分を格納するために異なる数のビットが使用される整数型と浮動小数点型にのみ適用されます。

ただし、数値の値は変更される可能性があるため、誤って変換しないようにキャストしてこのような変換を行う必要があります。

于 2015-02-19T15:31:11.840 に答える
1

狭めることはありませんが、それでも明示的でなければなりません。どちらも、もう一方にはない値を保持できます。intは負の値を保持できますが、 の最大値である 2147483647 より大きい値を保持するuintことはできません。uintint

ただし、 と はどちらもint32uintビット (= 4 バイト) を使用して情報を保持します。
を に変換するintと、は 8 ビットしか保持できないbyteため、情報が失われます。 と を変換してもビットは失われませんが、ビットの意味は異なります。(ケースの 50%) 自分が何をしているのかを知っていることを示すために、それについて明確にする必要があります。暗黙のキャストによって引き起こされるミスを防ぎます。byte
intuint

于 2015-02-19T15:32:35.320 に答える