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

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

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

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

Q&A

解決済

4回答

705閲覧

なぜfieldをchar型で?

geen48geen69

総合スコア8

C

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

0グッド

1クリップ

投稿2017/10/19 05:36

編集2017/10/19 05:37

###はじめに
初めて質問します。
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ページで確認できます。

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

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

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

guest

回答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)==1charは8ビット幅以上」の2点のみが保証されます。これは有名な(誰に?)「C/C++言語仕様は1バイト==8ビットとは言っていない」の言い換えです。この世に存在するか否かは別として、「sizeof(char)==sizeof(int)、いずれも16ビットワード幅」という処理系も許容されます。C/C++言語は(普通のプログラマが考える以上に)許容度合いが広い/ふわっとした定義になっているので、本当に困ったときに調べていけばよろしいかと...

投稿2017/10/19 06:13

編集2017/10/19 06:37
yohhoy

総合スコア6189

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

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

geen48geen69

2017/10/19 06:24

懇切丁寧な説明ありがとうございます。非常にありがたいです。こういった回答を待たずに既存の回答だけで選考してしまい早計でした。反省します。 やはり、boolを1ビット(2ビットは間違えでした。2状態と混同してしまいました)として1バイトで8つ動かすこともできるのですね(誤作動の元になるというのもやはり考え通りですが、、) また、機会があれば宜しくお願い致します。
yohhoy

2017/10/19 06:28

少し補足すると、std::vector<bool>を使えば、"自動的"に1バイトに8個のbool値を詰め込んで正しく管理してくれます。これが直接誤動作を引き起こしたりはしないので、安全につかうことができます。回答中に「微妙な問題が生じるケース」と書いたのは、もっと別の複雑なケースのお話ですから、実際に使おうと思ったときにでも調べてみてください。(Internet上に結構な情報があります)
yumetodo

2017/10/19 06:47

もっというとマルチスレッドやるときとかですね。
guest

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
ttyp03

総合スコア16996

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

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

geen48geen69

2017/10/19 06:27

なるほど、言われてみれば手持ちの教科書にもcharも整数型を格納するものとしてさらっと紹介されていた気がします。用途として文字ばかりに使われているためてっきり文字専用と勘違いしていました。ありがとうございます。
yumetodo

2017/10/19 06:49

文字列リテラルの型の種類がchar,wchar_t,char16_t,char32_tの4つあります(char8_t型ください)
guest

0

C++の変数の取る領域サイズは一般的な環境では以下の通りになります。

サイズ(byte)
int4
short2
char1
bool1

※処理系によってはこのとおりのサイズではないです。

で、なぜboolも1byte取っているかというと、コンピュータのメモリの「最小単位」が1byteだからです。確かにboolは0か1なので1bitしか必要ないのですが、箱の大きさの最小単位が1byteなので1bitしか使わないboolでも1byte必要なのです。

なので、char型で配列を作るのは結果的に一番効率のよい「最小の大きさの配列」ということになります。

投稿2017/10/19 05:42

編集2017/10/19 05:54
masaya_ohashi

総合スコア9206

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

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

yumetodo

2017/10/19 05:44

>まず訂正ですが、intは4byte、charは1byteです。 ダウト。intは4byteは真っ赤なウソ。
geen48geen69

2017/10/19 05:47

すいません。4Byteです。お二人ともありがとうございます。
yumetodo

2017/10/19 05:47

たまたまVC++の実装はint=4byteとしただけで、C++規格書ではsizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)とのみ規定されています
yumetodo

2017/10/19 05:48 編集

intが2byteの処理系は実在しますから、たかがVC++が4byteにしているくらいで全部がそうであるかのようなミスリードは避けるべきかと思われます。
geen48geen69

2017/10/19 05:49

つまり、処理系に依存する、ということですか?
masaya_ohashi

2017/10/19 05:52

私は「一般的な環境では」と前置きしています。たかがVC++といいますが、デファクトスタンダードで考えれば圧倒的に一般的なのはintが4byteの環境です。ですがあなたの言うことも正しいので回答に訂正を入れておきます。
yumetodo

2017/10/19 05:54

4byteというか32bitの型が欲しいときはstdint.h/cstdintで定義される`int32_t`型を利用するべきですし(8bit/16bit/64bitもあります)定まらない、と覚えた方がいいかと思われます。
maisumakun

2017/10/19 05:59

なお、charは規格上1バイトであることが必要です。
geen48geen69

2017/10/19 06:01

お二方とも、親切に教えていただきありがとうございました。ベストアンサーですが、優劣つけがたいため、即座に回答したくださった点と、獲得ポイントにより少ない方ということで。yumetodoさんにさせていただきます。masaya_ohashiさん、また今後機会があればどうぞよろしくお願いします。
masaya_ohashi

2017/10/19 06:02

はい、良い判断かと思います。私のは補足情報としてもらって帰ってください。独学がんばってください。
guest

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
yumetodo

総合スコア5850

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

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

geen48geen69

2017/10/19 05:42

回答ありがとうございます。 そういえばboolはC++からでしたね。 char型に整数値を代入するとどうなるのですか?
yumetodo

2017/10/19 05:44

char型は整数型ですから他の整数型と何ら変わりません
geen48geen69

2017/10/19 05:53

つまりシングルクォートで囲ったものは整数値に変換して値を保存しているんですね!? なるほど、ありがとうございます。 そのため文字の量が限られているからサイズも小さいわけですか。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問