C ++標準では、int、long型のサイズをどのように表現していますか?


696

基本的なC ++型のサイズに関する詳細情報を探しています。私はそれがアーキテクチャ(16ビット、32ビット、64ビット)とコンパイラに依存することを知っています。

しかし、C ++の標準はありますか?

32ビットアーキテクチャでVisual Studio 2008を使用しています。ここに私が得るものがあります:

char  : 1 byte
short : 2 bytes
int   : 4 bytes
long  : 4 bytes
float : 4 bytes
double: 8 bytes

私は、多くの成功なし、の大きさを述べる信頼できる情報を見つけることを試みたcharshortintlongdoublefloat(と私は考えていなかった他の種類の)異なるアーキテクチャとコンパイラの下で。


18
@thyrgleは選択によるものではありません...サポートするアーキテクチャが非常に多いため、柔軟性が必要です。
Krakkos


4
なぜ彼らはすべての漠然としたタイプを削除していない、と明確なビット長の種類などint32_t、のuint32_t、int64_tのなどに、すべてのそれを標準化
developerbmw

5
@thyrgleこのようなものを標準化することは実際にはかなり困難です。Javaとは異なり、JVMの動作方法が原因でこれらが一定である場合、C / C ++は基本的に、ファンシーパンシーアブストラクションレイヤー(少なくともJavaほど多くはない)なしで実行されるシステムに固執する必要があります。の間に。int型のサイズは重要なものが使用できるということであればint16_tint32_tそしてint64_t(必要性はiostream、私の記憶が正しければ、そのために含めます)。int64_tが32ビットシステムで問題を起こしてはならないというこの点の良い点(ただし、これはパフォーマンスに影響します)。
rbaleksandar 2015

5
@rbaleksandar実際には<cstdint>、ではなくで定義されてい<iostream>ます。
ジャスティン時間-モニカ

回答:


685

C ++標準では、整数型のサイズをバイト単位で指定していませんが、保持できる最小範囲を指定しています。必要な範囲からビット単位の最小サイズを推測できます。それとバイトのビット数CHAR_BIT定義するマクロの値から、バイト単位の最小サイズを推測できます。最も不明瞭なプラットフォームを除いてすべて8であり、8未満にすることはできません。これは、「Unicode UTF-8エンコード形式の8ビットコード単位」を保持するのに十分な大きさでなければならないためです。

の追加の制約の1つcharは、そのサイズが常に1バイトまたはCHAR_BITビット(したがって名前)であることです。これは標準で明示的に述べられています。

C標準はC ++標準の規範的な参照であるため、これらの要件を明示的に述べていなくても、C ++はC標準(22ページ)で必要な最小範囲を必要とします。これは、MSDN

  1. signed char:-127から127(注、-128から127ではありません。これは、1の補数および符号と大きさのプラットフォームに対応しています)
  2. unsigned char:0から255
  3. 「プレーン」charsigned charまたはと同じ範囲unsigned char実装定義
  4. signed short:-32767〜32767
  5. unsigned short:0から65535
  6. signed int:-32767〜32767
  7. unsigned int:0から65535
  8. signed long:-2147483647から2147483647
  9. unsigned long:0から4294967295
  10. signed long long:-9223372036854775807〜9223372036854775807
  11. unsigned long long:0から18446744073709551615

C ++(またはC)の実装では、型のサイズをバイト単位sizeof(type)で任意の値に定義できます。

  1. sizeof(type) * CHAR_BITは、必要な範囲を含めるのに十分な高さのビット数に評価されます。
  2. タイプの順序はまだ有効です(例:)sizeof(int) <= sizeof(long)

これをまとめると、次のことが保証されます。

  • charsigned charおよびunsigned char少なくとも8ビットであります
  • signed shortunsigned shortsigned int、及びunsigned int少なくとも16ビットであります
  • signed longそして、unsigned long少なくとも32ビットであります
  • signed long longそして、unsigned long long少なくとも64ビットであります

保証はの大きさについて行われていないfloatか、doubleそれは除いてdouble同じくらいの精度として、少なくとも提供しますfloat

実際の実装固有の範囲は<limits.h>、Cまたは<climits>C ++のヘッダーにあります(またはstd::numeric_limits<limits>ヘッダーにテンプレート化されています)。

たとえば、これはの最大範囲を見つける方法ですint

C:

#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;

C ++

#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();

49
むしろ、C ++標準では、バイトという語は「1 char」を意味し、通常の意味ではありません。
Ben Voigt

4
@Programmer回答(括弧内のポイント1の注記)または実際の標準の表現(回答にリンクされています)を読みます。C標準は、最も広く普及している2の補数とは異なる表現を持つ1の補数アーキテクチャに対応しています。最小保証範囲は、ほとんどの場合、実装が提供する実際の範囲とは異なります。
アレックスB

9
@アレックスBあなたはあなたの答えでダブルについて何も言及しなかった。浮動小数点変数の回答を更新していただけますか?
Cool_Coder 2014年

3
@Cool_Coder:浮動小数点は、追加の魚のやかんであり、簡単にポストのサイズを2倍にします。
Deduplicator

3
@Mooing Duck:「すべてのバージョンのC ++には256個の異なる値が必要です(signed char型の場合)」いいえ、それは、最新のC ++仕様で修正されるまで当てはまりませんでした。古い仕様では、signed char型に数値にマップしないビットパターンを含めることができたため、256の異なる値があるという要件がありませんでした。「符号なし文字タイプの場合、値表現のすべての可能なビットパターンは数値を表します。これらの要件は他のタイプには適用されません。」
エイドリアンマッカーシー

241

32ビットシステムの場合、「事実上の」標準はILP32です。つまりintlongポインタのすべての32ビット量です。

64ビットシステムの場合、主要なUnixの「事実上の」標準はLP64でlongあり、ポインタは64ビットです(ただしint32ビットです)。Windows 64ビット標準はLLP64でlong long、ポインターは64ビットです(ただしlongint両方とも32ビットです)。

かつて、一部のUnixシステムはILP64組織を使用していました。

これらの事実上の標準は、C標準(ISO / IEC 9899:1999)によって制定されたものではありませんが、すべて許可されています。

そして、定義により、sizeof(char)ある1Perlのconfigureスクリプトでのテストにもかかわらず、。

機械(Crays)があったなおCHAR_BIT意味すること8.、IIRCよりはるかに大きかった、sizeof(int)また1であった、なぜなら双方charintした32ビット。


73
+1は、物事が理論的にどうであるかではなく、ほとんどの場合重要なケースで物事が実際にどのようにあるかを述べるために。32ビットが必要な場合はintを使用し、64ビットが必要な場合はlong longを使用します。ネイティブにしたい場合は、size_tを使用してください。変化するため、「プレーン」は長く避けてください。これはほとんどのアプリケーションで機能します。
Eloff

37
答えは+1。@Eloff:逆に... 32ビットの使用[u]int32_tまたは類似のものを希望する場合、64ビットの使用を希望する場合[u]int64_t...ヘッダーがない場合は、ダウンロードするか、ヘッダーをダウンロードしてください。サイズを検証するためのそのようなタイプまたは静的アサーション。 pubs.opengroup.org/onlinepubs/009695299/basedefs/stdint.h.html 正確なサイズがそれほど重要ではなく、それらが少なくともそれほど大きくてもかまわない場合は、一般的な最新のPC /サーバープラットフォームについてのアドバイスが当てはまります。
Tony Delroy、2013年

8
CHAR_BIT> 8になっているのは古いクレイマシンだけではないことに注意してください。たとえば、DSPはしばしば16または32のCHAR_BITを持っています(たとえば、これらを参照してください)
nos

2
@nos:リンクありがとうございます。奇妙な事件のために現代の現在のシステムを特定することは非常に役に立ちます。好奇心から、それらのマシンに設定されているコードは何ですか?コードセットがUTF-16の場合、0xFFFFは有効な文字ではありません。また、コードセットがISO 8859-xコードセットである場合、0xFFFFは有効な文字ではありません(0x00〜0xFFの文字コードは有効です)。EOFの検出に問題があるとはまだ確信していませんが、注意が必要です。おそらく、int get_char(FILE *fp, char *c)EOFまたは0を返し、を設定する関数を作成して使用する余地があります*c
Jonathan Leffler、2014年

2
@joelw:C11では、「int」が32ビット以下のプラットフォームでは4294967295のuint32_t x=1,y=2;値を指定するx-y必要があり、「int」が33ビット以上のプラットフォームでは-1 でなければなりません。さらに、x*y"int"が32ビット以下の場合はxとyのすべての値に対してモジュラー算術を使用して評価する必要があり、65ビット以上の場合は従来の算術が必要ですが、大きな値で発生する可能性があることについて要件はありません「int」が33〜64ビットの場合、xおよびyの
スーパーキャット2016年

88

実際にはそのようなことはありません。多くの場合、あなたは期待することができますstd::size_t、現在のアーキテクチャでは、符号なしのネイティブ整数サイズを表す。つまり、16ビット、32ビット、または64ビットですが、この回答に対するコメントで指摘されているように、常にそうであるとは限りません。

他のすべての組み込み型に関する限り、それは実際にはコンパイラーに依存します。以下は、最新のC ++標準の現在の草案から抜粋した2つの抜粋です。

標準の符号付き整数型には、signed char、short int、int、long int、long long intの5つがあります。このリストでは、各タイプは、少なくともリストの前のタイプと同じ量のストレージを提供します。

標準の符号付き整数型ごとに、対応する(ただし異なる)標準の符号なし整数型が存在します:unsigned char、unsigned short int、unsigned int、unsigned long int、およびunsigned long long int、それぞれ同じ量のストレージと同じ配置要件があります。

必要に応じて、これらの基本的な型のサイズを静的に(コンパイル時に)アサートできます。仮定のサイズが変わった場合、コードの移植について考えるように警告します。


7
良いポスト。必要なもう1つのことは、次の最小ビットサイズです(limits.hとともにc89 / c99に文書化され、c ++に引き継がれます):char> = 8、shortおよびint> = 16、long> = 32。
ヨハネスシャウブ-litb

1
また、8ビットAVRプラットフォームでは、ポインターとintのサイズが16ビットであるため、size_tは8ビットではなく16ビットになります。したがって、プロセッサのネイティブデータサイズはsize_tとは関係ありません。
Robotbugs 2018年

80

基準があります。

C90標準では、

sizeof(short) <= sizeof(int) <= sizeof(long)

C99標準では、

sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

こちらがC99仕様です。22ページに、さまざまな整数型のサイズの詳細を示します。

Windowsプラットフォームのint型サイズ(ビット)は次のとおりです。

Type           C99 Minimum     Windows 32bit
char           8               8
short          16              16
int            16              32
long           32              32
long long      64              64

移植性が気になる場合、または型の名前にサイズを反映させたい場合は<inttypes.h>、次のマクロを使用できるヘッダーを確認できます。

int8_t
int16_t
int32_t
int64_t

int8_t8ビットでint16_tあることが保証され、16ビットなどであることが保証されます。


8
マイナーなひっかき:sizeof(long) < sizeof(long long)対称とは対照的に、標準はどこに言っていsizeof(long) <= sizeof(long long)ますか
ジョナサンレフラー2013

2
@JonathonLeffler-C99 5.2.4.2.1を参照-整数型のサイズ。minsizeof(int)== 16-bits、minsizeof(long)== 32-bits、minsizeof(long long)== 64-bits。maxsizeof(type)が指定されていないので、あなたは<=で正しいと思います。
ジェシーチザム2014年

同様に、sizeof(float)<= sizeof(double)<= sizeof(long double)です。C99 7.12パラグラフ2による
ジェシーチザム2014年

38

固定サイズの型が必要な場合は、stdint.hで定義されているuint32_t(符号なし整数32ビット)のような型を使用してください。それらはC99で指定されています。


10
それらは指定されていますが、必須ではありません。
dreamlax

2
@dreamlaxどのプラットフォームに含まれていませんか?
Levi Morrison

3
@LeviMorrison:必要な形式でそれらを持たないプラットフォーム。CHAR_BIT == 16たとえば、があるプラットフォームにはありませんint8_t。2の補数を使用しないプラットフォームには、それらのいずれも含まれません(標準では2の補数が必要であるため)。
DevSolar 2018

36

更新:C ++ 11はTR1の型を正式に標準に取り入れました:

  • long long int
  • 符号なしlong long int

と「サイズ」タイプから <cstdint>

  • int8_t
  • int16_t
  • int32_t
  • int64_t
  • (および署名されていない対応物)。

さらに、次のものが得られます。

  • int_least8_t
  • int_least16_t
  • int_least32_t
  • int_least64_t
  • さらに、署名されていない対応物。

これらの型は、少なくとも指定されたビット数を持つ最小の整数型を表します。同様に、少なくとも指定されたビット数の「最速」の整数型があります。

  • int_fast8_t
  • int_fast16_t
  • int_fast32_t
  • int_fast64_t
  • さらに、署名されていないバージョン。

「高速」の意味は、実装次第です。あらゆる目的で最速である必要もありません。


これは現在、C ++ 11標準の一部です。
Jaan

2
「高速」とは、ハードウェアアーキテクチャに合わせて調整されたという意味です。レジスタが16ビットの場合、int_fast8_tは16ビット値です。レジスタが32ビットの場合、int_fast8_tとint_fast16_tはどちらも32ビット値です。などを参照してくださいC99のセクション7.18.1.3項2
ジェシー・チザム

19

C ++標準、このようにそれを言います:

3.9.1、§2:

符号付き整数型には、「signed char」、「short int」、「int」、「long int」、「long long int」の5つがあります。このリストでは、各タイプは、少なくともリストの前のタイプと同じ量のストレージを提供します。プレーンなintは、実行環境のアーキテクチャ(44)によって提案された自然なサイズを持っています。その他の符号付き整数型は、特別なニーズを満たすために提供されています。

(44)つまり、ヘッダーで定義されているINT_MINとINT_MAXの範囲の値を含めるのに十分な大きさ <climits>です。

結論:作業しているアーキテクチャによって異なります。その他の仮定はすべて誤りです。


12

いいえ、タイプサイズの標準はありません。標準はそれだけを要求します:

sizeof(short int) <= sizeof(int) <= sizeof(long int)

固定サイズの変数が必要な場合にできる最善のことは、次のようなマクロを使用することです。

#ifdef SYSTEM_X
  #define WORD int
#else
  #define WORD long int
#endif

次に、WORDを使用して変数を定義できます。私がこれを好きというわけではありませんが、それは最もポータブルな方法です。


4
問題は、WORDがプログラムの周りで、固定サイズに実際には依存していない領域に広がることです(いくつかのWindowsコードを見てください)。私が16ビットシステムから32ビットシステムに移行したときにわかったように、WORDが解決しようとしていたのと同じ問題が発生します。
lilburne 2009

@liburneもちろん、WORDを使用するのは、ファイルの読み取りや書き込みを行う場合など、固定サイズの変数が必要な場合のみにしてください。コードの一部が実際に固定サイズに依存していない場合は、通常の「int」変数を使用する必要があります。
エミリアーノ

3
あなたは、ポータブルサイズを取得するためにできる最善のことはする必要があります#include <boost/cstdint.hpp>
kizzx2

11

独自の「標準」を作成できるように、型の同義語を定義できます。

sizeof(int)== 4のマシンでは、次のように定義できます。

typedef int int32;

int32 i;
int32 j;
...

したがって、実際にlong intのサイズが4である別のマシンにコードを転送する場合、intの単一のオカレンスを再定義できます。

typedef long int int32;

int32 i;
int32 j;
...

1
標準ヘッダー<stdint.h>(C99以降、およびCライブラリのC99バージョンを採用したC ++標準のいずれか)を考慮すると、これは必要ありません。
キース・トンプソン

8

浮動小数点数には標準(IEEE754)があります。浮動小数点数は32ビット、倍精度数は64です。これはハードウェア標準であり、C ++標準ではないため、コンパイラーは理論的に浮動小数点数と倍数を他のサイズに定義できますが、実際には異なるものを使用するアーキテクチャを見たことがありません。


2
ただし、IEEE 754(別名IEC 559)への準拠は、C ++内ではオプションです(おそらくCもですが、よくわかりません)。std :: numeric_limits :: is_iec559を参照してください。
Drew Hall、

1
次に、TIのTMS320C28xx DSP用のコンパイラは見たことがありません。ここでdouble、同じサイズfloat(およびとint同じchar、どちらも16ビット)があります。しかし、彼らは64ビットを持っていますlong double
starblue 2012

7

標準があり、さまざまな標準文書(ISO、ANSIなど)で指定されています。

ウィキペディアには、さまざまなタイプとそれらが保存できる最大数を説明する素晴らしいページがあります。 。コンピュータサイエンスの整数。

ただし、標準のC ++コンパイラでも、次のコードスニペットを使用すると比較的簡単に見つけることができます。

#include <iostream>
#include <limits>


int main() {
    // Change the template parameter to the various different types.
    std::cout << std::numeric_limits<int>::max() << std::endl;
}

std :: numeric_limitsのドキュメントはRoguewaveにありますます。これには、さまざまな制限を見つけるために呼び出すことができる他のコマンドが多数含まれています。これは、サイズを伝達する任意のタイプ、たとえばstd :: streamsizeで使用できます。

ジョンの回答には、最も確実な説明が含まれています。使用しているプラ​​ットフォームに関係なく、各タイプに含まれる必要があるビット数についてより詳細に説明している別の優れたページがあります。標準で定義されているint typesです。

これが役に立てば幸いです!



7

以下を使用できます。

cout << "size of datatype = " << sizeof(datatype) << endl;

datatype = intlong intなどあなたが入力する方データ型のサイズを見ることができます。


7

さまざまなアーキテクチャとさまざまなコンパイラの組み込み型に関しては、コンパイラで次のコードを実行して、コンパイラが出力する内容を確認します。以下は私のUbuntu 13.04を示しています(Raring Ringtail)64ビットg ++ 4.7.3の出力を示します。また、以下で回答された内容にも注意してください。これが、出力がそのように順序付けられる理由です。

「標準の符号付き整数型には、signed char、short int、int、long int、long long intの5つがあります。このリストでは、各型は、少なくともリスト内の先行する型と同じ量のストレージを提供します。」

#include <iostream>

int main ( int argc, char * argv[] )
{
  std::cout<< "size of char: " << sizeof (char) << std::endl;
  std::cout<< "size of short: " << sizeof (short) << std::endl;
  std::cout<< "size of int: " << sizeof (int) << std::endl;
  std::cout<< "size of long: " << sizeof (long) << std::endl;
  std::cout<< "size of long long: " << sizeof (long long) << std::endl;

  std::cout<< "size of float: " << sizeof (float) << std::endl;
  std::cout<< "size of double: " << sizeof (double) << std::endl;

  std::cout<< "size of pointer: " << sizeof (int *) << std::endl;
}


size of char: 1
size of short: 2
size of int: 4
size of long: 8
size of long long: 8
size of float: 4
size of double: 8
size of pointer: 8

sizeof(char)含めるべきではありません。
ベン

3

前述のように、サイズは現在のアーキテクチャを反映する必要があります。limits.h現在のコンパイラがどのように処理しているかを確認したい場合は、ピークに入ることができます。


ありがとう、でも私が持っていないアーキテクチャのサイズ(64ビットなど)を知りたいのですが。32ビットachitecturesについてこのチュートリアルだけの話...
ジェローム・

2

他の人が答えたように、「標準」はほとんどの詳細を「実装定義」として残し、タイプ「char」はリート「char_bis」ワイドであり、「char <= short <= int <= long < = long long "(floatとdoubleはIEEE浮動小数点標準とほぼ一致しており、long doubleは通常doubleと同じですが、現在の実装ではこれよりも大きい場合があります)。

非常に具体的で正確な値がない理由の一部は、C / C ++などの言語が多数のハードウェアプラットフォームに移植できるように設計されているためです。 "char"ワードサイズが4ビットのコンピューターシステムを含みます。または7ビット、または平均的なホームコンピューターユーザーがさらされている「8/16/32/64ビット」コンピューター以外の値。(ここでのワードサイズとは、システムが通常動作するビット幅を意味します-繰り返しになりますが、家庭用コンピューターのユーザーが期待するように、必ずしも8ビットであるとは限りません。)

特定のビット数のオブジェクト(整数値を表す一連のビットという意味で)が本当に必要な場合、ほとんどのコンパイラーはそれを指定する方法をいくつか持っています。しかし、それは一般に移植性がなく、たとえame社によって作成されたコンパイラ間でも、異なるプラットフォーム用です。一部の標準と慣行(特にlimits.hなど)は十分に一般的であり、ほとんどのコンパイラーは、使用されるビット数ではなく、特定の範囲の値に最適なタイプを決定するためのサポートを備えています。(つまり、0から127までの値を保持する必要があることがわかっている場合、コンパイラが8ビットの「int8」タイプをサポートしていると判断できます。これは、必要な全範囲を保持するのに十分な大きさですが、 「7ビット」と完全に一致する「int7」タイプ。)

注:多くのUn * xソースパッケージは、コンパイラ/システムの機能を調査し、適切なMakefileとconfig.hを出力する「./configure」スクリプトを使用していました。これらのスクリプトのいくつかを調べて、それらがどのように機能し、どのようにしてコンパイラー/システム機能を調査するかを確認し、その先導に従うことができます。


1

純粋なC ++ソリューションに関心がある場合は、テンプレートとC ++標準コードのみを使用して、コンパイル時にビットサイズに基づいて型を定義しました。これにより、コンパイラ間でソリューションを移植できます。

背後にある考え方は非常に単純です。char、int、short、long、long long(符号付きバージョンと符号なしバージョン)のタイプを含むリストを作成し、リストをスキャンして、numeric_limitsテンプレートを使用して、指定されたサイズのタイプを選択します。

このヘッダーを含めると、8つのタイプstdtype :: int8、stdtype :: int16、stdtype :: int32、stdtype :: int64、stdtype :: uint8、stdtype :: uint16、stdtype :: uint32、stdtype :: uint64が得られます。

あるタイプを表現できない場合、そのヘッダーで宣言されているstdtype :: null_typeに評価されます。

以下のコードは保証なしで提供されています。ダブルチェックしてください。
私はメタプログラミングの初心者です。このコードを自由に編集して修正してください。
DevC ++でテスト済み(そのため、gccバージョンは約3.5)

#include <limits>

namespace stdtype
{
    using namespace std;


    /*
     * THIS IS THE CLASS USED TO SEMANTICALLY SPECIFY A NULL TYPE.
     * YOU CAN USE WHATEVER YOU WANT AND EVEN DRIVE A COMPILE ERROR IF IT IS 
     * DECLARED/USED.
     *
     * PLEASE NOTE that C++ std define sizeof of an empty class to be 1.
     */
    class null_type{};

    /*
     *  Template for creating lists of types
     *
     *  T is type to hold
     *  S is the next type_list<T,S> type
     *
     *  Example:
     *   Creating a list with type int and char: 
     *      typedef type_list<int, type_list<char> > test;
     *      test::value         //int
     *      test::next::value   //char
     */
    template <typename T, typename S> struct type_list
    {
        typedef T value;
        typedef S next;         

    };




    /*
     * Declaration of template struct for selecting a type from the list
     */
    template <typename list, int b, int ctl> struct select_type;


    /*
     * Find a type with specified "b" bit in list "list"
     *
     * 
     */
    template <typename list, int b> struct find_type
    {   
        private:
            //Handy name for the type at the head of the list
            typedef typename list::value cur_type;

            //Number of bits of the type at the head
            //CHANGE THIS (compile time) exp TO USE ANOTHER TYPE LEN COMPUTING
            enum {cur_type_bits = numeric_limits<cur_type>::digits};

        public:
            //Select the type at the head if b == cur_type_bits else
            //select_type call find_type with list::next
            typedef  typename select_type<list, b, cur_type_bits>::type type;
    };

    /*
     * This is the specialization for empty list, return the null_type
     * OVVERRIDE this struct to ADD CUSTOM BEHAVIOR for the TYPE NOT FOUND case
     * (ie search for type with 17 bits on common archs)
     */
    template <int b> struct find_type<null_type, b>
    {   
        typedef null_type type;

    };


    /*
     * Primary template for selecting the type at the head of the list if
     * it matches the requested bits (b == ctl)
     *
     * If b == ctl the partial specified templated is evaluated so here we have
     * b != ctl. We call find_type on the next element of the list
     */
    template <typename list, int b, int ctl> struct select_type
    {   
            typedef  typename find_type<typename list::next, b>::type type; 
    };

    /*
     * This partial specified templated is used to select top type of a list
     * it is called by find_type with the list of value (consumed at each call)
     * the bits requested (b) and the current type (top type) length in bits
     *
     * We specialice the b == ctl case
     */
    template <typename list, int b> struct select_type<list, b, b>
    {
            typedef typename list::value type;
    };


    /*
     * These are the types list, to avoid possible ambiguity (some weird archs)
     * we kept signed and unsigned separated
     */

    #define UNSIGNED_TYPES type_list<unsigned char,         \
        type_list<unsigned short,                           \
        type_list<unsigned int,                             \
        type_list<unsigned long,                            \
        type_list<unsigned long long, null_type> > > > >

    #define SIGNED_TYPES type_list<signed char,         \
        type_list<signed short,                         \
        type_list<signed int,                           \
        type_list<signed long,                          \
        type_list<signed long long, null_type> > > > >



    /*
     * These are acutally typedef used in programs.
     * 
     * Nomenclature is [u]intN where u if present means unsigned, N is the 
     * number of bits in the integer
     *
     * find_type is used simply by giving first a type_list then the number of 
     * bits to search for.
     *
     * NB. Each type in the type list must had specified the template 
     * numeric_limits as it is used to compute the type len in (binary) digit.
     */
    typedef find_type<UNSIGNED_TYPES, 8>::type  uint8;
    typedef find_type<UNSIGNED_TYPES, 16>::type uint16;
    typedef find_type<UNSIGNED_TYPES, 32>::type uint32;
    typedef find_type<UNSIGNED_TYPES, 64>::type uint64;

    typedef find_type<SIGNED_TYPES, 7>::type    int8;
    typedef find_type<SIGNED_TYPES, 15>::type   int16;
    typedef find_type<SIGNED_TYPES, 31>::type   int32;
    typedef find_type<SIGNED_TYPES, 63>::type   int64;

}

0
unsigned char bits = sizeof(X) << 3;

どこXcharintlongなど。はあなたのサイズ与えるXビットでは。


1
charは常に8ビットであるとは限らないため、式は8ビット以外のcharを使用するアーキテクチャでは機能しません。のみsizeof(type)*CHAR_BITを保持
phuclvの

CHAR_BIT8ビットで<< 3あることが保証されていたとしても、* 8やを書くのは単に難読化された方法* CHAR_BITです。
キース・トンプソン

0

Alex BからC ++標準では、整数型のサイズをバイト単位で指定していませんが、保持できる最小範囲を指定しています。必要な範囲からビット単位の最小サイズを推測できます。それとバイトのビット数を定義するCHAR_BITマクロの値からバイト単位の最小サイズを推測できます(ほとんどのプラットフォームでは8であり、8未満にすることはできません)。

charのもう1つの制約は、サイズが常に1バイト、またはCHAR_BITビット(したがって名前)であることです。

標準(22ページ)で必要な最小範囲は次のとおりです。

およびMSDNのデータ型の範囲:

符号付き文字:-127から127(注、-128から127ではない。これは1の補数プラットフォームに対応)符号なし文字:0から255「プレーン」文字:-127から127または0から255(デフォルトの文字の符号性に依存)符号付きshort:-32767〜32767 unsigned short:0〜65535 signed int:-32767〜32767 unsigned int:0〜65535 signed long:-2147483647〜2147483647 unsigned long:0〜4294967295 signed long:-9223372036854775807〜9223372036854775807 unsigned long long: 0から18446744073709551615 C ++(またはC)の実装では、型のサイズをバイト単位で定義できます。sizeof(type)は、次の条件を満たす値にできます。

式sizeof(type)* CHAR_BITは、必要な範囲を含めるのに十分なビット数に評価され、typeの順序はまだ有効です(たとえば、sizeof(int)<= sizeof(long))。実際の実装固有の範囲は、CまたはC ++のヘッダーにあります(または、ヘッダーのテンプレート化されたstd :: numeric_limits)。

たとえば、これはintの最大範囲を見つける方法です:

C:

#include <limits.h>
const int min_int = INT_MIN;
const int max_int = INT_MAX;

C ++:

#include <limits>
const int min_int = std::numeric_limits<int>::min();
const int max_int = std::numeric_limits<int>::max();

これは正しいですが、次のようにも言っていました:char:1バイトshort:2バイトint:4バイトlong:4バイトfloat:4バイトdouble:8バイト

32ビットアーキテクチャは依然としてデフォルトで最も使用されているため、メモリが利用できなくなった32ビット以前の時代からこれらの標準サイズを維持しており、下位互換性と標準化のために同じままでした。64ビットシステムでさえこれらを使用する傾向があり、拡張/変更があります。詳細については、これを参照してください:

http://en.cppreference.com/w/cpp/language/types


0

ここでの他のすべての答えはほぼ整数型にのみ焦点を当てていることに気づきましたが、質問者は浮動小数点についても尋ねました。

C ++標準ではそれが必要だとは思いませんが、最近の最も一般的なプラットフォームのコンパイラは、一般にIEEE754標準に従って浮動小数点数を求めています。この規格では、4種類の2進浮動小数点(およびC ++コンパイラでサポートされていないBCD形式)を指定しています。

  • 半精度(binary16)-11ビットの仮数、指数範囲-14〜15
  • 単精度(binary32)-24ビットの仮数、指数範囲-126〜127
  • 倍精度(binary64)-53ビットの仮数、指数の範囲は-1022〜1023
  • 4倍精度(binary128)-113ビットの仮数、指数範囲-16382〜16383

では、これはどのようにC ++型にマッピングされるのでしょうか。通常、floatは単精度を使用します。このように、sizeof(float) = 4。次に、double倍精度を使用し(これが名前のソースであると思いますdouble)、long double倍精度または4倍精度になります(私のシステムでは4倍ですが、32ビットシステムでは2倍になる場合があります)。半精度の浮動小数点を提供するコンパイラについては知りません。

要約すると、これは通常のことです。

  • sizeof(float) = 4
  • sizeof(double) = 8
  • sizeof(long double) = 8または16

ジェフがなぜ彼が必要以上に多くのバイトを使用するのか疑問に思うの一部として私がこの質問に到達したのはおかしい。
Aniruddha Varma


-2

OpenGLQtなどのライブラリによって提供される変数を使用できます。

たとえば、Qt qint8(Qtでサポートされるすべてのプラットフォームで8ビットであることが保証されています)、qint16、qint32、qint64、quint8、quint16、quint32、quint64などを提供します。


1
質問に回答しません
EvilTeach 2016

-8

64ビットマシンの場合:

int: 4
long: 8
long long: 8
void*: 8
size_t: 8

2
一部の64ビットマシンでintは8バイトですが、その他は保証されていません。それがchar8ビットだけであるべきだと言うことは何もありません。sizeof(void*)==464ビットなのに許される。
2015

-10

サイズに基づいて4種類の整数があります。

  • 短整数:2バイト
  • 長整数:4バイト
  • long long integer:8バイト
  • 整数:コンパイラーに依存(16ビット、32ビット、または64ビット)

11
誤り、それらはすべてアーキテクチャに依存しており、最小範囲は他の回答の1つで説明されています。何も持っているの実装を停止していないshortintlongすべての32ビットの整数を。
Matteo Italia

タイプに正しい名前を使用していません。名前には、int「整数」という単語ではなく、キーワードを使用します。
キーストンプソン、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.