web-dev-qa-db-ja.com

Cのintは常に32ビットですか?

これは次の質問に関連しています、

Cで32ビット整数を宣言する方法

ほとんどのプラットフォームでintは常に32ビットであると言う人もいます。これが本当かどうか知りたいです。

異なるサイズのintを持つ最新のプラットフォームを知っていますか? 8ビットまたは16ビットアーキテクチャの恐竜プラットフォームは無視してください。

注:他の質問から32ビット整数を宣言する方法はすでに知っています。これは、他のサイズの整数をサポートしているプラ​​ットフォーム(CPU/OS /コンパイラ)を見つけるための調査のようなものです。

20
ZZ Coder

何人かの人が述べているように、「int」が32ビットになるという保証はありません。特定のサイズの変数を使用する場合、特にビット操作を伴うコードを作成する場合は、必須の「標準整数型」を使用する必要があります。 c99仕様による。

int8_t
uint8_t
int32_t
uint32_t

等...

それらは一般に[u] intN_tの形式であり、「u」は符号なしの量が必要であることを指定し、Nはビット数です。

これらの正しいtypedefは、コンパイルするプラットフォームのstdint.hで利用できるはずです。これらを使用すると、優れたポータブルコードを記述できます:-)

42
David Claridge

常に 32ビットオンほとんどプラットフォーム」-そのスニペットの何が問題になっていますか? :-)

C標準は、その整数型の多くのサイズを義務付けていません。 does相対的なサイズを義務付けます。たとえば、sizeof(int) >= sizeof(short)などです。また、最小範囲が義務付けられていますが、複数のエンコードスキーム(2の補数、1の補数、および符号/大きさ)が可能です。

特定のサイズの変数が必要な場合は、次のような#ifdefの使用など、実行しているプラ​​ットフォームに適した変数を使用する必要があります。

#ifdef LONG_IS_32BITS
    typedef long int32;
#else
    #ifdef INT_IS_32BITS
        typedef int int32;
    #else
        #error No 32-bit data type available
    #endif
#endif

または、C99以降では、正確な幅の整数型intN_tおよびuintN_tを使用できます。


  1. typedef name intN_tは、幅N、パディングビットなし、2の補数表現の符号付き整数型を指定します。したがって、int8_tは、正確に8ビットの幅を持つ符号付き整数型を示します。
  2. typedef name uintN_tは、幅Nの符号なし整数型を指定します。したがって、uint24_tは、正確に24ビットの幅を持つ符号なし整数型を示します。
  3. これらのタイプはオプションです。ただし、実装が幅8、16、32、または64ビットの整数型を提供し、パディングビットがなく、(符号付き型の場合)2の補数表現を持つ場合は、対応するtypedefを定義する必要があります。名前。
17
paxdiablo

現時点では、ほとんどのデスクトップおよびサーバープラットフォームは32ビット整数を使用しており、多くの組み込みプラットフォーム(ハンドヘルドARMまたはx86)は32ビットintsを使用していると考えてください)も使用しています。 16ビットのintに到達するには、実際に非常に小さくする必要があります。「Berkeley mote」または、より小さなAtmel Atmegaチップのいくつかを考えてみてください。しかし、それらはそこにあります。

6
Norman Ramsey

いいえ。小さな組み込みシステムは16ビット整数を使用します。

3
starblue

それはあなたのコンパイラに大きく依存します。 64ビットマシンで64ビットとしてコンパイルするものもあれば、32ビットとしてコンパイルするものもあります。組み込みシステムは、独自の小さな特殊なワックスボールです。

あなたがチェックするためにできる最善のこと:

_printf("%d\n", sizeof(int));
_

sizeofはバイトを出力することに注意してください。 sizeof(int)*CHAR_BITを実行してビットを取得します。

さまざまなタイプのビット数を出力するコード:

_#include <limits.h>
#include <stdio.h>

int main(void) {
    printf("short is %d bits\n",     CHAR_BIT * sizeof( short )   );
    printf("int is %d bits\n",       CHAR_BIT * sizeof( int  )    );
    printf("long is %d bits\n",      CHAR_BIT * sizeof( long )    );
    printf("long long is %d bits\n", CHAR_BIT * sizeof(long long) );
    return 0;
}
_
2
Eric

さて、ほとんどのARMベースのプロセッサは、16ビットモードであるThumbコードを実行できます。これには、まだ噂されているAndroidノートブックと最先端のスマートフォンが含まれます。

また、一部のグラフ電卓は8ビットプロセッサを使用しており、それらもかなり最新のものと呼んでいます。

1
Christoffer

TIは、主にビデオのデコードに使用されるC55xDSPを搭載したOMAPボードを引き続き販売しています。このために提供されているコンパイラには16ビット整数があると思います。 32ビットDSPを入手できますが、恐竜ではありません(Nokia 770は2005年にリリースされました)。

作成するほとんどのコードは、DSPで実行されることはないと安全に想定できます。しかし、おそらくすべてではありません。

1
Steve Jessop

ビット数ではなく実際の最大/最小値にも関心がある場合は、 limits.h に知りたいことのほとんどすべてが含まれています。

0
Michael Stum