私は最近、ある疑問を思いつきました。私たちが持っているとしましょう:
void test(int32_t b){
printf("value is %d", b);
}
int main(){
uint32_t a = 43;
test(a);
return 0;
}
符号なし変数を符号付きパラメータに渡すとどうなりますか? 値のコピーはどのように機能し、キャストはどのように機能しますか?
誰か詳しく説明してくれませんか?
ありがとう
値が十分に小さい場合は、単純に割り当てられます。それ以外の場合は、実装定義の方法で割り当てられます。通常、これは「ラップアラウンド」することを意味します。
6.3.1.3-1
整数型の値が_Bool 以外の別の整数型に変換される場合、その値が新しい型で表現できる場合は変更されません。
それ以外の場合、新しい型が符号なしの場合、値が新しい型の範囲内になるまで、新しい型で表現できる最大値よりも 1 多い値を繰り返し加算または減算することによって、値が変換されます。
それ以外の場合、新しい型は署名され、値を表現できません。結果が実装定義であるか、実装定義のシグナルが発生します。
a
b
代入によって as ifの型に変換されます。
(C99, 6.5.2.2p7) 「呼び出された関数を示す式にプロトタイプを含む型がある場合、引数は、割り当てによるかのように、対応するパラメーターの型に暗黙的に変換され、それぞれの型を取得します。パラメータは、宣言された型の非修飾バージョンになります。」
あなたの場合、変換される値が新しい型で表現できる場合、それは変更されません。
(C99, 6.3.1.3p1) 「整数型の値が _Bool 以外の別の整数型に変換される場合、その値が新しい型で表現できる場合、値は変更されません。」
それ以外の場合は、実装定義の方法で変換されます。
(C99、6.3.1.3p3) 「それ以外の場合、新しい型は署名されており、値を表すことができません。結果が実装定義であるか、実装定義のシグナルが発生します。」
そのデータ型の変換は透過的だと思いますが、注意が必要です。uint32_t の値が int32_t が保持できるよりも大きい場合、int32_t は望ましくない値にロールオーバーします。