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

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

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

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

8回答

6397閲覧

[C++] 整数型の使い分け

yama_da

総合スコア73

C

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

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/05/15 14:46

こんばんは。
「要素数がかなり大きくなりそうだか、要素となる値自体は大して大きくない(せいぜい2、3ケタ)」というような状況で、メモリ量を少しでも減らすために要素の型としてintの代わりにcharやshortを使うことは解決法になりますか?また、デメリットはありますか?

あと、こちらはついでで良いのですが、shortの使い時が分かりません。どんな場面で使われるのでしょうか?また、charを文字でなく1Byteの整数型として扱かう場面はありますか?

質問が多くてすみません、後半の質問はついでなので無視してもらっても構いません。宜しくお願いします。

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

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

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

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

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

guest

回答8

2

他の回答で見られなかったことで思い当たることについて書いていきます


shortやcharは構造体の実際のデータサイズを抑える上で重要な役目があります。
構造体を用いている場合データ型のアラインメントを考えなくてはいけません。
例えば、下記の構造体は一般的には8バイトです。

struct sample{ char a; int b; }

C#では構造体は16バイト以下にしよう、という指針があったりします。
単に小さい方が良いというのももちろんありますが、そういう時に、最も小さく、欲しい情報を持てるだけの構造体を設計したくなりますよね。
shortは単純にint1個分で2個持てますから、構造体を考える時には重要な役目を持ちます。
例えば、以下のようにRECTを定義すると構造体のサイズは2倍違いますよね。

struct RECTsmall { short x; short y; short height; short width; } struct RECTlarge { int x; int y; int height; int width; }

データ型のアラインメントでぐぐってみてください。
short, floatは特にディスプレイ上に描画するプログラムで使われます。


charを使うデメリットは単体のアプリケーション内ではありませんが、他のツールとやり取りしようとすると混乱を招く場合があります。
例えばC#のcharはUTF-16の1文字、つまり2バイトです。
C++からC#へchar配列を移そうと思ったら、その型はchar[]じゃなくbyte[]になったりします。
もちろん、正規手順として文字列を受け渡している場合にはこの限りじゃないけど、文字以外でchar型を使うとそういうマーシャリングの混乱を招く時はあります。

投稿2017/05/16 02:50

haru666

総合スコア1593

yuba, majiponi👍を押しています

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

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

2

こんにちは。

メモリ量を少しでも減らすために要素の型としてintの代わりにcharやshortを使うことは解決法になりますか?また、デメリットはありますか?

サイズの異なる整数型が用意されているのは、正にそのような目的です。
デメリットはオーバーフローに要注意ですね。

Windowsの16ビット時代に16ビットで表現していた値が小さすぎでみんな苦労しました。一度決めた後、変更しづらい値について小さな領域しか割り当てないと、10年後20年後に苦労するということはよくあることです。

shortの使い時が分かりません。

小さな値しか表現しない時にint型が勿体無いような時使うことはあります。
でも単体で使う時はあまりメリットはないです。やはり配列のように多数定義する時に効果があります。・・・①
他のソフトとデータをやり取りする時も使います。無駄にファイル・スペースや通信のペイロードを使わないようにする意味なので、結局①と同じですね。

また、charを文字でなく1Byteの整数型として扱かう場面はありますか?

どちらかと言うとunsigned charを使う場合が多いように思いますが、ケースバイケースです。char型は符号の有無が処理系で異なり、かつ、メジャーな処理系のデフォルトは符号付きなので意外にはまります。でも、unsigned charにすると安易にchar型を受け取るような関数があるとちょっと面倒です。


ちなみに、C++はchar, unsigned char, signed charを全て文字や文字列として扱うようです。(usngined charは数値として扱ってほしかった。...)

投稿2017/05/15 15:30

Chironian

総合スコア23274

majiponi, KSwordOfHaste👍を押しています

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

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

episteme

2017/05/16 00:18

[余計なお世話] int/shortの類は処理系によってbyte-sizeが異なりますが、新しメのコンパイラであれば <stdint.h>(or <cstdint>) に int16_t とか uint8_t とか、大きさの定まった型が typedef されています。可搬性を重視するならこいつらを使うと幸せになれるハズ。
guest

0

ほかの人が書いてない点でいえば、
short,charの符号付き整数だと演算で符号拡張が行われるってのを忘れてしまいがちな点ですね。

適当な例が思いつかないけど
short a=-10,b=5; //16bitとして
printf("%04X %04X",a,b);

思っていた表示になりました?

投稿2017/05/16 03:42

tmp

総合スコア331

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

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

0

要素数がかなり大きくなりそうだか(中略)intの代わりにcharやshortを使うことは解決法になりますか?また、デメリットはありますか?

なりえます。なりえる、と可能性を示唆する表現を用いたのは、ならない場合もあるからです。
私が最初にプログラムを覚えたのは親父の使っていたMicrosoft Quick C 2.0でしたが、その環境では、short型はint型と全く同じ大きさでした。
他にも、特殊な環境では、charもshortもintも全て同じ、ということがあります。
しかし、大多数の環境では、charやshortを配列に利用すれば、容量削減になります。
配列以外で用いた場合は、容量削減になるとは限りません(構造体の中など)。

デメリットは、実行時間のロスが発生する可能性、可読性が多少落ちることでしょうか。
CPUが得意な単位を無視するので、若干のロスが発生する可能性があります(環境次第)。
あと、shortはともかく、charは「通常」、文字を扱うために用いられる型なので、コードの読み手に、余計な神経を使わせてしまいます。多くの方がおっしゃるようにbool、int_8などの表現を用いたほうがよいと思います。

投稿2017/05/16 02:34

majiponi

総合スコア1722

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

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

0

グラフィックスプログラミングの分野でも、グラフィックスメモリの節約やキャッシュ効率改善による高速化のために、単精度浮動小数点数の代わりに半精度の16ビットデータ型を用いる場合があるそうです。
コンピュータの性能も昔よりかなり向上したとはいえ、求められるグラフィックス品質も高解像度でリッチなものになって、開発者側の苦労はなかなか減らないようですね。

投稿2017/05/16 01:26

Bongo

総合スコア10816

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

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

0

ベストアンサー

メモリ量を少しでも減らすために要素の型としてintの代わりにcharやshortを使うことは解決法になりますか?また、デメリットはありますか?

解決法になります。
次の回答につながりますが、使用する値の範囲に合わせた型を選択することは、正しいコーディングだと思います。
デメリットは特にないです。

shortの使い時が分かりません。

shortに限らず、charもintもlongもfloatもdoubleも、それぞれに範囲があります。
charなら-128~127、shortなら-32768~32767など。
参考
最初の回答にも書きましたが、想定される値の範囲に合わせた型を選択することは正しいコーディングだと思います。
値が0~255までしかありえない場合にunsigned charを選択しておきます。
その変数にコーディングミスで256を代入した場合、コンパイルのタイミングで警告が出るので、事前にバグを防ぐことができます。
といった理由で、メモリ削減以前に、プログラマが明示的な書き方をすることでよりよいコードになると思います。

逆にメモリが豊富にある時代ですので、思わぬバグを防ぐために、あらかじめintやlongを選択するという考え方もありますが・・・。
業務で使うようなコードでなければこれもありかと思いますが、やはりきちんとしたプログラムにはきちんと型を選びたいものです。

charを文字でなく1Byteの整数型として扱かう場面はありますか?

普通にあります。
むしろこの使い方の方が多いかもしれません。
例えば次のようにフラグに用いたりします。
char flag; // 0 or 1

投稿2017/05/16 00:28

ttyp03

総合スコア17000

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

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

0

理屈の上ではサイズの小さい変数の方が省メモリであるだろうとは思います。が、意識したことはほとんどありません。これくらいならコンパイラの自動最適化のカバー範疇でしょう。むしろ、互換性を保つ用途に使うイメージがあります。

ただ、学生時にこれと似たようなアイディアを用いて省メモリプログラミングでグラフ探索アルゴリズムを実装したことがあります。博士課程の先輩のテーマともされていた(当時としては)大規模ネットワーク探索の困難課題だったのですが、**「探索アルゴリズムの効率化に関わらず省メモリプログラミングで作ったら簡単に解けるものであった」**という結論でして、この件を発表したら教官や先輩方にズッコケられました。メモリ管理も盲点になりがちですが、重要な課題ではあります。

投稿2017/05/15 15:52

HogeAnimalLover

総合スコア4853

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

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

0

そのintは何ビットですか?

投稿2017/05/15 15:10

....

総合スコア102

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

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

yama_da

2017/05/15 15:22

回答ありがとうございます。 僕の環境では、 short 16bit int 32bit long 64bit です。
....

2017/05/16 12:47 編集

JIS X3014(プログラム言語C++)には「符号付き整数型には"signed char"、"short int"、"int"、"long int"の四つがある。これらの型の記憶域は、右にある方が大きいか等しい。単なるintの記憶域の大きさは、実行環境のハードウェア構成から自然に決まる。その他の符号付き整数型は、特殊な要件を満たすために提供される。」とあります。 ではそれぞれの型の値の範囲(要するにビット数)はどこで規定されているかというと、それはあなたが使っているコンパイラを作った人達がコンパイラ仕様として決めています。 通説では「intはターゲットのCPUのデータバスのビット幅と一致する」場合がほとんどですが、これは「実行環境のハードウェア構成から自然に決まる」という規格を満たした結果らそうなったわけで、「自然に決まったんだから演算も最も速いはずだ」と理解されます。 一方、shortやlongの型の値の範囲は「特殊な要件」を満たせるように決めることになっており、これはつまり現実世界で扱いたい数値の大きさや互換性やしがらみでコンパイラ開発者が決め、longを16ビットにしたいけどCPUが8ビットの演算しか持っていないなら2回処理を繰り返すサブルーチンをコンパイラが生成して辻褄を合わせるということになります。 従って、速く処理したい場合はint型でオーバーフローやアンダーフローしないアルゴリズムを作って実装するという考え方もあります。 しかしコンパイラの最適化でも十分な速度が得られるなら、トリッキーなアルゴリズム(つまり人間による最適化)を考えるよりも、実世界の数式に近い演算式で記述したほうがバグ取りや保守がしやすいという考え方もありますし、その場合には数式の計算過程の値を表現できる型を選ぶことになります。 とは言え所詮はshortやlongはコンパイラ毎に違う可能性があるので、同じソースコードを異なるコンパイラやハードウェアで同じ結果が得られるようにするためには厳密にビット数を明示するべきなので、int32_tやuint16_tなどのようなstdint.hヘッダで定義されているビット数付きの整数型を使います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問