質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

4回答

6171閲覧

int型の先頭アドレスについてです。

strike1217

総合スコア651

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2016/11/29 01:05

C言語の int 型についてなのですが、
int = 32bit ですよね(32bit)

この場合、8Bit(1Byte) x 4 = 32bit (4byte)
になると思います。

例えば、
int *a;
int b;
a = &b;
*a = 9;

みたいにポインタを使うと思います。(ポインタは面倒ですね・・・)
このときaのポインタをアドレスで初期化する場合、int型の先頭のアドレスを入れているはずですよね?

char = 8bit(1Byte)なので「int型というのはchar型が4個ある配列のようなもの」という理解で正しいのでしょうか?

int型の先頭アドレスというのはこの4つの配列の一番最初の1byteのアドレスが入っているということですか?

int型の宣言で1つのint型に1つのアドレスだと「先頭のアドレス」という意味がよくわからなくなりますよね?
いくつかあるアドレスの先頭だよ・・・というのであれば理解できますが・・・

どなたか教えてください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

こんにちは。

char = 8bit(1Byte)なので「int型というのはchar型が4個ある配列のようなもの」という理解で正しいのでしょうか?

考え方はその通りです。

ただし、具体的にははそこそこ違います。
int型が32ビットとは限りませんし、char型も8ビットとは限りません。
int型が16ビットなCPUは多数あります。C言語のchar型が8ビットでないCPUは見たことはないですが、C言語の規格上は8ビット以上です。
また、char型はアライメントをあまり気にしませんが、int型は気にします。つまりint型を任意の位置に置けないCPUもあります。インテルCPUは寛容な方ですが、4の倍数アドレス以外からの4バイトにint型を配置すると遅いです。

int型の宣言で1つのint型に1つのアドレスだと「先頭のアドレス」という意味がよくわからなくなりますよね?

いくつかあるアドレスの先頭だよ・・・というのであれば理解できますが・・・

その理解で合ってます。


【蛇足ですが】
なお、CPUによっては「アドレス」が8ビット毎に割り当てられるとは限りません。16ビット毎だったり32ビット毎だったりすることもあります。
これはメモリ・アクセスがバス幅単位であること由来です。バス制御回路を単純にできますから、小型CPUでは今も残っているのではないかと思います。

ああ!! そのようなCPUにCコンパイラが対応している場合、char型がint型と同じサイズって実装もありそうな気がします。char型ポインタを素直に実装できますから。だから、1バイト=8ビットがISOやIECで規定された後もC言語規格では1バイトは8ビット以上のままなのかも。

投稿2016/11/29 02:18

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/11/29 14:36

1Byteにつき1つのアドレスが割り当てられるとは必ずしも限らないのですね! ありがとうございます
guest

0

ベストアンサー

イメージとしてはあっているかと思います。
例えばaという変数が1000番地配置されていて、1という値が入っている場合、図で表すとこんな感じになるかと思います。
CPUによっては上位と下位ビットが逆だったりします。エンディアンといいますが、詳細はWikipediaをどうぞ。

0x1000|00
0x1001|00
0x1002|00
0x1003|01

&aというと0x1000を指すことになります。

図解しているサイトも探せばあると思うので探してみてください。
例えばこことか。
http://d.hatena.ne.jp/temtan/20101108/1289223558
先ほどのエンディアンのWikiも参考になると思います。

投稿2016/11/29 01:20

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/11/29 01:22

なるほど!左様でございますか! ありがとうございます。 aというのはint型でいいんですよね?
ttyp03

2016/11/29 01:27

そうです。 32ビットOSのint型の場合になります。
strike1217

2016/11/29 14:34

ありがとうございます!
guest

0

考え方としてはあってます。

(実験コード、実際に使うと環境またいだときに悲しみがとまらない。)

C

1int x = (4<<24) + (3<<16) + (2<<8) + (1<<0); 2char* xs = &x; 3for(int i = 0; i < 4 ; i++){ 4 printf("%d ",xs[i]); // 1 2 3 4 (環境によっては逆順) 5}

投稿2016/11/29 02:22

編集2016/11/29 02:25
ozwk

総合スコア13521

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/11/29 14:33

ありがとうございます。 やってみますね!
guest

0

int = 32bit ですよね(32bit)

最近の環境が4byteが多いだけでint型のサイズは環境によって変わりません、固定的に4byte=32bitというのは間違いです。

char = 8bit(1Byte)なので「int型というのはchar型が4個ある配列のようなもの」という理解で正しいのでしょうか?

エンディアン
というメモリへの値の配置方法があり、ビッグエンディアン/リトルエンディアンで並び方が異なります。charのように1byteの場合はあまり影響がないですが、複数バイトの型の場合には注意が必要で、intが4byteの環境で単純にcharが4つ並んだものという考えは間違いです。

ユーザーのアドレス空間とかで例をあげると数値が見えにくく理解しづらいと思うので、現実ではありえないけどとても単純かします。
例えば
intが4byteの環境でリトルエンディアンで
int型で要素数が4つの配列 arr_int
cahr型で要素数が4つの配列arr_char
があったとします。

arr_int[0] = 10;
arr_int[1] = 20;
arr_int[2] = 30;
arr_int[3] = 40;

arr_char[0] = 10;
arr_char[1] = 20;
arr_char[2] = 30;
arr_char[3] = 40;

これらの先頭アドレスが例えば10番地というアドレスだったとします。
そうすると
charのほうは
10番地に10(2進数で0000 1010)
11番地に20(2進数で0001 0100)
12番地に30(2進数で0001 1110)
13番地に40(2進数で0010 1000)

というようにメモリに配置される、これがintの場合
10番地に 0000 1010
11番地に 0000 0000
12番地に 0000 0000
12番地に 0000 0000

14番地に 0001 0100
15番地に 0000 0000
16番地に 0000 0000
17番地に 0000 0000

18番地に 0001 1110
19番地に 0000 0000
20番地に 0000 0000
21番地に 0000 0000

22番地に 0010 1000
23番地に 0000 0000
24番地に 0000 0000
25番地に 0000 0000

という風に値が格納される
なのでここでいうint配列の先頭アドレスは10番値で10番値から4byte分をひとかたまりとしてみてくださいねという意味です。逆にcharの場合は10番値の1byteだけみてくださいねという意味になります。

投稿2016/11/29 01:41

hiim

総合スコア1689

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2016/11/29 14:41

なるほど!! ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問