5

私は最近、ある疑問を思いつきました。私たちが持っているとしましょう:

void test(int32_t b){
    printf("value is %d", b);
}

int main(){
    uint32_t a = 43;
    test(a);  
   return 0;
}

符号なし変数を符号付きパラメータに渡すとどうなりますか? 値のコピーはどのように機能し、キャストはどのように機能しますか?

誰か詳しく説明してくれませんか?

ありがとう

4

3 に答える 3

5

値が十分に小さい場合は、単純に割り当てられます。それ以外の場合は、実装定義の方法で割り当てられます。通常、これは「ラップアラウンド」することを意味します。

6.3.1.3-1

整数型の値が_Bool 以外の別の整数型に変換される場合、その値が新しい型で表現できる場合は変更されません

それ以外の場合、新しい型が符号なしの場合、値が新しい型の範囲内になるまで、新しい型で表現できる最大値よりも 1 多い値を繰り返し加算または減算することによって、値が変換されます。

それ以外の場合、新しい型は署名され、値を表現できません。結果が実装定義であるか、実装定義のシグナルが発生します。

于 2012-05-30T20:00:52.093 に答える
3

ab代入によって as ifの型に変換されます。

(C99, 6.5.2.2p7) 「呼び出された関数を示す式にプロトタイプを含む型がある場合、引数は、割り当てによるかのように、対応するパラメーターの型に暗黙的に変換され、それぞれの型を取得します。パラメータは、宣言された型の非修飾バージョンになります。」

あなたの場合、変換される値が新しい型で表現できる場合、それは変更されません。

(C99, 6.3.1.3p1) 「整数型の値が _Bool 以外の別の整数型に変換される場合、その値が新しい型で表現できる場合、値は変更されません。」

それ以外の場合は、実装定義の方法で変換されます。

(C99、6.3.1.3p3) 「それ以外の場合、新しい型は署名されており、値を表すことができません。結果が実装定義であるか、実装定義のシグナルが発生します。」

于 2012-05-30T20:03:48.613 に答える
2

そのデータ型の変換は透過的だと思いますが、注意が必要です。uint32_t の値が int32_t が保持できるよりも大きい場合、int32_t は望ましくない値にロールオーバーします。

于 2012-05-30T20:03:07.057 に答える