###はじめに
初めて質問します。
C++を独学で勉強しているプログラミング初心者です。
youtubeにゲヱム道館さんのプログラミング実況の動画が上がっていて、win32コンソールアプリケーションで動くテトリスを作られていました。(url:
https://m.youtube.com/watch?v=iosmmQvhyzM)
その動画内で気になる点があったので質問します。
###質問点
テトリスのフィールドを作る際、field[][]をchar型で宣言されています。実際入れている数値はブロックの有る無しの0or1です。数字を入れるのであればint型じゃないの?と思いました。
###自分の見解
int型は8バイト、char型は2バイトのデータだったはずなので、多次元配列等多くのメモリを喰うものはchar型の方がいいのかな?と思いました。
###最後に
上の考えがあっていた場合、boolなら2ビットのデータを扱ってるのにそれではダメなのか?
そもそもchar型の1とか0とかってなんですか?
間違っている点がございましたらご指摘ください。どうぞよろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
多次元配列等多くのメモリを喰うものはchar型の方がいいのかな?と思いました。
この解釈に賛同します。
field[][]をchar型で宣言されています。実際入れている数値はブロックの有る無しの0or1です。数字を入れるのであればint型じゃないの?と思いました。
char
型は1バイトしか占有しませんから、特に要素数が大きいときのメモリ節約テクニックとして使われることがあります。本ケースのような要素数であれば、誤差のようなメモリ節約にしかならないため、好みの問題かと思います。int
型の方が「自然」ではという意見にも賛同です。
boolなら2ビットのデータを扱ってるのにそれではダメなのか?
正確には1ビットのデータですね。bool
型でも代用可能です。これも好みの問題かと思います。
より現実的な問題として、bool
の配列型を使っても、char
の配列型よりメモリ節約になることはありません。つまりbool a[80];
としても1バイトに8個のビットが詰め込まれることはなく、80バイトのメモリを占有してしまいます。C++でstd::vector<bool>
とすると、1バイトに8個のビットが詰め込まれて、10バイト(+管理用変数)のようにメモリ節約できますが、微妙な問題が生じるケースもあり個人的に強くはお勧めしません。
そもそもchar型の1とか0とかってなんですか?
char
型は整数型(integer type)の一種ですから、普通に整数値を扱うことができます。普通のPC環境であれば、char
型が符号ありの場合は -128~127 を、符号無しならば 0~255 の値を格納できます。
妙な言い回しになっているのは、char
型の符号有無はコンパイラによって異なるためです。(さらに重箱の隅をつつくと -127~127 範囲になる環境もあります。通常はそんな事まで気にせずとも大丈夫でしょう。)
余談ですが:yumetodoさんが指摘するとおり、プログラミング言語CやC++の仕様としてはint
型のサイズは厳格に何バイトと決められていません。仕様上は「少なくとも16ビット幅以上」ことだけが決まっています。…というのが細かい話ですが、普通のPC環境でプログラミングする上では「int=4バイト」と覚えていても、そうそう問題にはならないと思います。
余談の余談:maisumakunさんコメント「charは規格上1バイトであることが必要」も厳密解釈ではちょっと微妙です。規格上は「sizeof(char)==1
とchar
は8ビット幅以上」の2点のみが保証されます。これは有名な(誰に?)「C/C++言語仕様は1バイト==8ビットとは言っていない」の言い換えです。この世に存在するか否かは別として、「sizeof(char)==sizeof(int)、いずれも16ビットワード幅」という処理系も許容されます。C/C++言語は(普通のプログラマが考える以上に)許容度合いが広い/ふわっとした定義になっているので、本当に困ったときに調べていけばよろしいかと...
投稿2017/10/19 06:13
編集2017/10/19 06:37総合スコア6189
0
charとかintとかの名称に惑わされてはいけません。
違いは型のサイズが異なるのみです。
charは1バイト、intは環境によりますが2バイトとか4バイト、longは4バイト、など領域を持っています。
1バイトで表現できる数値の範囲は以下の通りです。
符号付きなら-128~127
符号なしなら0~255
つまり0か1かを表現したいだけならchar型で足りるのです。
charという名称は単に文字コードを格納するのに適しているからでしょう。
投稿2017/10/19 05:52
編集2017/10/19 06:17総合スコア16996
0
C++の変数の取る領域サイズは一般的な環境では以下の通りになります。
型 | サイズ(byte) |
---|---|
int | 4 |
short | 2 |
char | 1 |
bool | 1 |
※処理系によってはこのとおりのサイズではないです。
で、なぜboolも1byte取っているかというと、コンピュータのメモリの「最小単位」が1byteだからです。確かにboolは0か1なので1bitしか必要ないのですが、箱の大きさの最小単位が1byteなので1bitしか使わないboolでも1byte必要なのです。
なので、char型で配列を作るのは結果的に一番効率のよい「最小の大きさの配列」ということになります。
投稿2017/10/19 05:42
編集2017/10/19 05:54総合スコア9206
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/19 05:44
2017/10/19 05:45 編集
2017/10/19 05:47
2017/10/19 05:47
2017/10/19 05:48 編集
2017/10/19 05:49
2017/10/19 05:51
2017/10/19 05:52
2017/10/19 05:54
2017/10/19 05:59
2017/10/19 06:01
2017/10/19 06:02
0
ベストアンサー
その人bool型を知らないのではなかろうか。内容がC++じゃなくてCだし・・・。
void main()
とかいう間違ったことやってる時点で察して。
int
にするのはメモリー使用量的におバカだから論外として、bool
使えよとは思う。
追記
余談ですが、
masaya_ohashi
確かにboolは0か1なので1bitしか必要ないのですが、箱の大きさの最小単位が1byteなので1bitしか使わないboolでも1byte必要なのです。
これはまあそうなんですが、std::vector<bool>
とかstd::bitset<N>
は内部でbit演算をすることで一要素1bitづつを実現していたりします。
0or1の値をchar
ではなくbool
に入れるのは、0か1以外取らないですよ、という表明になり可読性が向上します
投稿2017/10/19 05:39
編集2017/10/19 05:51総合スコア5850
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/19 05:42
2017/10/19 05:44
2017/10/19 05:53
2017/10/19 05:56
2017/10/19 06:00
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/10/19 06:24
2017/10/19 06:28
2017/10/19 06:47