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

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

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

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

Q&A

解決済

3回答

1445閲覧

C言語の構造体について

rockn26

総合スコア16

C

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

0グッド

0クリップ

投稿2020/07/25 03:05

C言語歴は5年位ですが、いまだわからない事だらけのPG/SEです。

以下の場合、どちらも構造体のサイズは8になると思っていたのですが、違うようです。
又、struct bitsの書き方を記載しているC言語の書籍も見たこともありません。
どういった場合に使われるのでしょうか。

#include <stdio.h> // ビットフィールドの宣言とメンバの初期化 struct bits { unsigned char b1 : 1; // メンバの初期化 unsigned char b2 : 1; unsigned char b3 : 1; unsigned char b4 : 1; unsigned char b5 : 1; unsigned char b6 : 1; unsigned char b7 : 1; unsigned char b8 : 1; }; struct bits2 { unsigned char b1; unsigned char b2; unsigned char b3; unsigned char b4; unsigned char b5; unsigned char b6; unsigned char b7; unsigned char b8; }; void main(int argc, char *argv[]) { printf("bitsのサイズは%ldバイトです\n", sizeof(struct bits)); printf("bits2のサイズは%ldバイトです\n", sizeof(struct bits2)); }

実行結果
bitsのサイズは1バイトです
bits2のサイズは8バイトです

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

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

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

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

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

guest

回答3

0

なんで、bitsが、8バイトになると思ったのでしょうか?
1bit x 8 => 8bit => 1byte では?

もっともアライメントがらみでならない場合もあるかとは思いますが。

どういった場合に使われるのでしょうか。

以前は、少しでもメモリ節約なんて言っていましたが、コードが分かりにくくなるので、やめた方が良いかと。組み込みあたりだと、1bit単位で意味を持つ事があり、unionと組み合わせて使う事があります。(ただし、ハードウェア依存)

あ、

unsigned char b1 : 1; // メンバの初期化

初期化じゃないです。 1bitの指定です。間違えないように。

投稿2020/07/25 05:18

pepperleaf

総合スコア6383

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

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

rockn26

2020/08/08 14:53

> unsigned char b1 : 1; // メンバの初期化 > 初期化じゃないです。 1bitの指定です。間違えないように。 返答ありがとうございます。勉強したいと思います。
guest

0

ベストアンサー

こうすると構造体のサイズを8にできます

cpp

1struct bits { 2 unsigned char b1 : 1; // b1 を 1bitで専有 3 unsigned char : 0; // 次の型境界に強制的にアラインメント 4 unsigned char b2 : 1; 5 unsigned char : 0; 6 unsigned char b3 : 1; 7 unsigned char : 0; 8 unsigned char b4 : 1; 9 unsigned char : 0; 10 unsigned char b5 : 1; 11 unsigned char : 0; 12 unsigned char b6 : 1; 13 unsigned char : 0; 14 unsigned char b7 : 1; 15 unsigned char : 0; 16 unsigned char b8 : 1; 17};

ビットフィールドの説明はこのサイトが簡潔でわかりやすかったです。
https://docs.microsoft.com/ja-jp/cpp/cpp/cpp-bit-fields?view=vs-2019

どういった場合に使われるのでしょうか。

バイナリファイルのヘッダの読み込み等では無いでしょうか。
例: bitmap https://ja.wikipedia.org/wiki/Windows_bitmap#%E6%83%85%E5%A0%B1%E3%83%98%E3%83%83%E3%83%80
char*で読み込んでもよいのですが、構造体にロードさせることで、フラグ等も余計なビット演算を記述せず取り出せます。
(構造体のデータの順序が常に一定であるようなコンパイラに限ります)


pepperleafさんも書いていますが、何故サイズが8になると思っていたのかを書いてください。

投稿2020/07/25 13:52

maai

総合スコア463

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

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

rockn26

2020/08/08 14:52

返答有難うございました。 ビットフィールドという概念を理解していませんでした。 勉強したいと思います。
guest

0

お持ちの書籍の索引で「ビットフィールド」を探してください。

投稿2020/07/25 03:13

Daregada

総合スコア11990

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

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

rockn26

2020/08/08 14:56

返答有難うございました。 C言語の書籍は数冊ありますが、「ビットフィールド」で調べたところ 記載していたのは1冊だけで、1ページにも満たない内容でした。 勉強したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問