ここから本文です

C言語の整数拡張について。 規格では、関数の実引数を渡すときにも整数拡張され...

gre********さん

2019/9/813:54:53

C言語の整数拡張について。

規格では、関数の実引数を渡すときにも整数拡張されるらしいです。

たとえば、void hoge(char fuga); といった関数に対して、
char a = 1;
hoge(a);
と、記述したとします。

処理系のintが4バイトとすると、
このとき、スタックには0x00000001が格納されるのでしょうか?

一方、ローカル変数として、
char b = 1;
と記述したとします。

このときは、スタックに1バイト分のみ確保されるのでしょうか。

整数拡張は処理系で扱いやすいようにするものだと認識していますが、
だとすると、ローカル変数に関しても最初から4バイト確保すれば良いと思うのですが。

実際は通常の算術型変換が起こる計算を記述したとき、整数拡張されるコードが
生成される感じなのでしょうか。

閲覧数:
53
回答数:
2
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

n2q********さん

2019/9/815:27:41

《プロトタイプ宣言がある場合》

void hoge(char fuga); の宣言が先にあれば、hoge に対する引数は char 型であることが分かります。なので、char 型のデータをそのまま渡せば良いわけです。

ただ、スタックに1バイトのデータを push するということが普通は出来ないでしょうから「intが4バイトとすると、このとき、スタックには0x00000001が格納」という現象が普通に見られると言えます。ただしこれは、処理系次第と考えるべきでしょう。



《プロトタイプ宣言が無い場合》

void hoge(char fuga); の宣言が先に無ければ、int hoge(); という暗黙の宣言が内部的に採用される形となります。C++ の場合と異なり、C 言語の場合はプロトタイプ宣言は無くても良いわけですので。

また、int hoge(); と int hoge(void); は C 言語では別物となっており、int hoge(); は、要するに int hoge(...); です。

この場合、hoge が char 型の引数を受け取るということが分からないため、int 型への拡張が必要。ちなみに float 型でしたら double に拡張されます。


printf("%d\n", a);

この場合も同じです。a は int 型に変換されます。これはスタックの都合とは別のお話になります。




【一方、ローカル変数として、char b = 1;と記述したとします。このときは、スタックに1バイト分のみ確保されるのでしょうか。】

ええ、そうです。



【実際は通常の算術型変換が起こる計算を記述したとき、整数拡張されるコードが生成される感じなのでしょうか】

ええ、そうです。

あとは上述のようにプロトタイプ宣言が無い場合、可変長引数であるために、型が分からない場合、です。

  • 質問者

    gre********さん

    2019/9/815:38:09

    なるほどです。
    規格に記載されている、実引数を渡すときにも整数拡張が発生するというのは無視しても良いのでしょうか?
    これがどういう処理を指しているのか悶々としています。

  • その他の返信を表示

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

この回答は投票によってベストアンサーに選ばれました!

ベストアンサー以外の回答

1〜1件/1件中

プロフィール画像

カテゴリマスター

2019/9/814:12:29

計算機とコンパイラーによって結果が異なります。
でも、ちゃんと1 バイトだけスタックに確保される場合が多いです。

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

あわせて知りたい

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる