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

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

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

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

Q&A

解決済

6回答

7103閲覧

C++のint型について

nomi

総合スコア32

C++11

C++11は2011年に容認されたC++のISO標準です。以前のC++03に代わるもので、中枢の言語の変更・修正、標準ライブラリの拡張・改善を加えたものです。

C++

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

0グッド

0クリップ

投稿2018/02/17 15:01

概要

C++でのint型は、環境によってサイズが違うため、サイズが固定された型を使うべきであるという意見を見ました。そこで、このサイトを見たところ、整数型が何種類もあることがわかりました。そして、int型ではなくint_fast32_tint_least32_tを使った方が環境に依存しないプログラムが書けることもなんとなくわかりました。
そこで質問なのですが、int_fast32_tint_least32_tは何が違うのでしょうか?状況によって使い分けるのだと思いますが、どうやって使い分ければ良いのかわかりません。サイトの説明を見たところint_fast32_tの方が高速と書かれているので、わざわざ高速でないint_least32_tを使う機会は無いと思うのですが。

知りたいこと

  • int_fast32_tint_least32_tの違い。
  • int_fast32_tint_least32_tの使い分け。どんな状況でどちらを使うのかを知りたいです。

参照サイト

C++日本語リファレンス-cstdint

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

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

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

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

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

guest

回答6

0

ベストアンサー

こんにちは。

int_fast32_tとint_least32_tの違い。

32bitで考えるとちょっと判りにくいと思います。16bitで考えてみましょう。
int_fast16_tは16ビット以上の最も高速な型、int_least16_tは最低16ビットある型です。
前者はPCの場合32ビット幅ではないかと予想します。後者は16ビット幅でしょう。

wandboxでやってみました。

C++

1#include <iostream> 2#include <cstdint> 3 4int main() 5{ 6 std::cout << sizeof(int_fast16_t) << "\n"; 7 std::cout << sizeof(int_least16_t) << "\n"; 8}

結果は

text

18 22

そう言えばwandboxは64ビットですので64ビットが最速ということなのだろうと思います。

int_fast32_tとint_least32_tの使い分け。どんな状況でどちらを使うのかを知りたいです。

上記から使い分けは明らかですね。メモリ消費を気にせず高速にしたい時fast、メモリ・サイズが気になる時leastの方を使えば良いです。

投稿2018/02/17 15:11

Chironian

総合スコア23272

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

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

nomi

2018/02/19 07:28

以下のような解釈で合ってますか? 「leastもfastも指定したビットサイズは最小限確保される。しかし、fastの方はその環境においてより高速になるようなビットサイズが確保される」
Chironian

2018/02/19 07:36

その通りです!
nomi

2018/02/21 09:05 編集

なるほど!その点に関してはわかりました! 追加で2つ質問があります! 1つ目:int16_tの説明に「実装するかどうかは処理系定義」とありますが、これの意味がいまいちわかりません。処理系によってはこの型は存在しないということでしょうか? 2つ目:逆に、int_fast16_tやint_least16_tはどんな環境でも確実に存在するのでしょうか?
Chironian

2018/02/21 09:16

> 処理系によってはこの型は存在しないということでしょうか? その通りです。 > どんな環境でも確実に存在するのでしょうか? 該当のバージョンの規格書に準拠していない処理系には存在しないかも知れません。
yohhoy

2018/02/22 14:14 編集

追加補足です: > int16_tの説明に「実装するかどうかは処理系定義」 intN_t/uintN_t型が提供されるか否かは、その処理系が厳密にNビット幅の整数型を提供するか否かに依存します。C/C++では「もし処理系にNビット幅整数型が存在するならば、必ずintN_t/uintN_t型を提供すべき」という強い規定になっています。 (本来の"処理系定義"は「提供するかもしれないし、しないかもしれない」という弱いニュアンスですが、intN_t/uintN_t型については前述の通り少し強いニュアンスになっています。) 一般的なPC環境では 1バイト=8ビット になっていますから、実用上はすべての環境でintN_t/uintN_t型が提供されるといっても差し支えありません。 (1バイト=9ビット幅の環境や、1バイト=16ビット幅という環境の場合はこの限りではありません。滅多にお目にかかることは無いと思います...)
nomi

2018/02/25 02:59

int_fastやint_leastを使わなくても、一般的な環境ならint_tで十分だということですね
guest

0

int_fast32_tやint_least32_tを使った方が環境に依存しないプログラムが書けることもなんとなくわかりました。

それは誤りです。fastとleastの違いについてはChironianさんが説明されていますが、要するに、実際のビット数は処理系依存となります。ですので、移植性を考慮したプログラムを書く際には使わない方が良いです。

ということで、実際には、厳密に名前通りのビット数の整数型となる、int16_tとかint32_tなどを使うことが圧倒的に多いです。
実装するかどうかは処理系定義などと書かれていますが、よほど特殊な処理系(GPUとかFPGAとか)でない限り、我々が一般的にアプリ開発でターゲットにする処理系では、int8_t~int64_t/uint8_t~uint64_tはちゃんと定義されているので、それらを使った方が移植性の高いプログラムが書けます。

投稿2018/02/17 15:41

catsforepaw

総合スコア5938

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

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

0

規格上

  • int型は16bitより大きい
  • long型は32bitより大きい
  • long long型は64bitより大きい

と定義されています。

つまり、大体16bit程度までの値ならばintをそれより大きくなるならlong / long longを使えばいいのです。

ですが、大体では問題になる場合が存在します。

メモリ/ファイル/通信データから値を取ってくる場合など
自分とは別の環境との境界では厳密な型定義が必要になります。
この場合にint32_tなどを用いればよいでしょう。
int32_tが定義されてない処理系で安易にint_fast32_tなどを用いると何bitになるか想像がつきませんので、
それよりはint32_tを使いコンパイルエラーになった方がありがたいです。
その時特殊環境用の専用処理としてint_fast32_tかint_least32_tを使うかを考えます。
この場合、その環境のメモリの潤沢さ等を考慮して選ぶ事になるでしょう。

また、メモリ事情がカツカツで実質32bitで定義されている事の多いintを16bit用の値として使えない場合も想定されます。
その場合はint_least16_tを用いるでしょう。

投稿2018/02/21 23:51

編集2018/02/21 23:55
asm

総合スコア15147

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

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

0

C++でのint型は、環境によってサイズが違うため、サイズが固定された型を使うべき

それ自体が正しい意見なのかが気になります。というのも、

  • Cの標準関数はintlongを引数や返り値にするので、それ以外の型を使うと、どこで変換が入るかが環境によって違ってしまう
  • size_ttime_tなど、正しい幅がシステム依存になっているものがあり、これらを正しくハンドリングするにはそれらの名前を使うしかない
  • Windows APIを使う場合や組み込み向けの開発など、マシン環境が決め打ちになる例も多い

ということで、「サイズが固定された型を使う」ことにそこまでメリットがあるわけでもないのかなというのが、自分としての考えです。

投稿2018/02/17 22:50

maisumakun

総合スコア145183

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

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

0

C/C++というのは1byteが8bitではない環境も想定している言語で実際にそういう環境でも使われています。int8_t~int64_t/uint8_t~uint64_t型はそういう環境では定義できません。なのでleast系があるという考え方もあると思います。

投稿2018/02/17 16:19

yumetodo

総合スコア5850

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

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

0

「環境によってサイズが違うため、サイズが固定された型を使うべき」については私もmaisumakunさん同様それほどメリットがあるとは思えません。
環境によってと書かれている通り、影響があるのは同じソースコードを他の環境に移植した場合です。
今まで2バイトの環境だったのが、移植したら4バイトになった。
動的に確保しているメモリが2バイト前提だったら、移植先の環境ではおかしなことになる。
とかそういう場合でしょう。
ただ、だからといって何でもかんでもint型でいいや、というのも違うと思います。
私としては「プログラマが意図している数値範囲を明確にするため、サイズが固定された型を使うべき」だと思います。

投稿2018/02/19 01:13

ttyp03

総合スコア16998

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問