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

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

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

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

4回答

5346閲覧

【C言語】3byteの型を扱いたい。

syalpon

総合スコア24

C

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

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

1クリップ

投稿2020/04/18 04:37

データ型についての質問

初心者ながらC言語について質問させていただきます。
C言語で数値を変数に代入する際に最小サイズの型を選びたいとき、
100であれば1byteのchar型、1000であれば2byteのshort型が適切かと思います。

今、65536 を変数に代入したいのですが、ビットで表すと
(65536){10} = (10000000000000000){2} = 1<<16
となり65536を表すには17bit必要になります。
これを入れるための型はC言語ではintの4byte=32bitの型が適切になるかと思います。
ですが、3byteあれば65536は表すことができるので、4byteではなく3byteの型を使いたいのですが、C言語にはそのような型がありません。

なので無理やり構造体のビットフィールドを使って17bitの型のように扱おうとしましたがうまくいかず、メンバが char c[3]; のみの構造体で3byteの型で試みたりしたのですが
各8bitずつで処理される為桁上がりがせず代替できないです。

自分なりに調べたところC言語では自作で型は作れないそうなので諦めてint型を使うべきなのでしょうか?
これに限らず、何かしら数値を3byteで扱いたい場合などは何か対処できるのでしょうか?

補足(開発環境)

windows10 64bit
bcc32:Cpad for Borland C++ compiler

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

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

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

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

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

dodox86

2020/04/18 04:41

取り扱う数値の範囲が0~65536ならば16+1ビット必要ですが、1~65536 ならばその元の値から1を引くことで16ビットに収まります。それでは代用できませんか。
cateye

2020/04/18 04:54 編集

>4byteではなく3byteの型を使いたい・・・・・必要なことなのでしょうか? ・・・・ビットフィールドであっても、そのデータが収まる最小のデータ(int=32bitの環境なら,17ビットはintに昇格される)に成りますが? →多倍長整数でググってみましょう。
syalpon

2020/04/18 05:01

ご返信ありがとうございます。 >取り扱う数値の範囲が0~65536ならば16+1ビット必要ですが、1~65536 ならばその元の値から1を引くことで16ビットに収まります。それでは代用できませんか。 実際に少し組んでみて代用してみます。 >・・・・ビットフィールドであっても、そのデータが収まる最小のデータ(int=32bitの環境なら,17ビットはintに昇格される)に成りますが? まったくもってその通りです。 自分自身ビットフィールドの扱いに疎く、初めはそのように使っていたのですが、結局1bitずつ指定しても最大データサイズの倍数になってしまうので、char型で指定しても17bitの構造体は3byteになってしまいます。 >必要なことなのでしょうか? 絶対に必要かどうかと聞かれるとそうではないのですが、C言語で何ができて何ができないのかを詳しく知りたくて質問しました。
guest

回答4

0

こんにちは。

なぜに3バイトにしたいのでしょうか?
近代的なCPUはほぼ全て2のべき乗バイト数で数値を取り扱います。
それから外れた使い方をすることも不可能ではないですが、性能が大幅に落ちます。

また、最近のコンピュータのメモリは非常に潤沢にありますので、数値一つの1バイトの節約が、全体の価格を下げることをほぼ期待できません。

普通にint型を使うことをお勧めします。

投稿2020/04/18 04:56

Chironian

総合スコア23272

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

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

syalpon

2020/04/18 05:12

ご返答ありがとうございます。 個人的に1byteのあまりが気に入らなかったのでメモリ節約のために3byteで扱いたかったのです。ご指摘の通り効率化目的です。 3byteに限らず最小サイズで扱いたいなと思い立ったので実際にやろうとすると失敗していました。 仰る通り、コンピュータは2の冪乗が扱いやすいので3byteにして扱のは良くないと再度思いました。 余計なことせずintで扱う方が効率が良いのですね。理解しました。 ありがとうございました。
guest

0

ベストアンサー

こんなんで。

#include <stdio.h> typedef struct {     char b[3]; } byte3; int get(byte3 d) {     union {         struct {             byte3 b;             char c;         };         int d;     } ud = { d, 0};     return ud.d; } byte3 set(int d) {     union {         int d;         struct {             byte3 b;             char c;         };     } ud = { d};     return ud.b; } int main() {     byte3 dat[20];     int i;     for (i = 0; i < sizeof dat / sizeof(dat[0]); i++)         dat[i] = set(1 << i);     for (i = 0; i < sizeof dat / sizeof(dat[0]); i++)         printf("%d:%d\n", i, get(dat[i]));     printf("%d:%d\n", sizeof(byte3), sizeof dat);     return 0; } コード

投稿2020/04/18 05:16

PingHermit

総合スコア478

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

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

syalpon

2020/04/18 05:21

ご返答ありがとうございます! 同じようなコードを書いていましたが、大変わかりやすく、感激です。
guest

0

stdint.h をインクルードして、
int32_t あるいはuint32_tをつかえばいいです

無理して3バイトの型を作っても、
扱いが煩わしい
演算が遅い
メモリの節約にならない
ということになり、使う意味がありません

投稿2020/04/18 05:31

y_waiwai

総合スコア88042

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

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

syalpon

2020/04/18 05:34

ご返答ありがとうございます。 なるほどそのようなヘッダファイルがあるのですね。参考になりました。 他の方もご指摘の通りメモリの節約にならない点は改めて勉強になりました。 やはり無理やり必要な分だけ使うよりかは2冪で扱う方がなにかと便利なのですね。 ありがとうございます。
guest

0

プログラム内処理では、4バイトの整数変数を使います。
0~65536の値を使うなら、メモリ使用率的にも処理効率的にもベストです。

プログラム外と、3バイトバイナリーの値で入出力することは可能です。

投稿2020/04/18 04:46

otn

総合スコア85901

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

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

syalpon

2020/04/18 05:15

ご返答ありがとうございます。 なるほど、やはりコンピュータが扱いやすい数字で扱った方が良いのですね。 3byteでも出力は可能なんですね。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問