質問

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

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

ほとんどのプラットフォームでは int は常に 32 ビットであると何人かの人々が言及しました。これが本当なのかどうか興味があります。

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

注記: 他の質問で 32 ビット整数を宣言する方法はすでに知っています。これは、どのプラットフォーム (CPU/OS/コンパイラ) が他のサイズの整数をサポートしているかを調べるための調査に似ています。

役に立ちましたか?

解決

複数の人が述べているように、特定のサイズの変数を使用する場合、特にビット操作を伴うコードを記述する場合は、「int」が32ビットになるという保証はありません。 c99仕様で義務付けられているタイプ。

int8_t
uint8_t
int32_t
uint32_t

etc ...

通常は[u] intN_tの形式で、「u」は符号なしの数量が必要であることを指定し、Nはビット数です

これらの正しいtypedefは、コンパイルするプラットフォームに関係なく、stdint.hで利用可能である必要があります。これらを使用すると、移植性の高いコードを作成できます:-)

他のヒント

"は いつも 32ビットオン ほとんど プラットフォーム」 - そのスニペットのどこが間違っているのでしょうか?:-)

C 標準では、多くの整数型のサイズを義務付けていません。それ する たとえば、相対的なサイズを義務付ける 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 名前 intN_t 幅のある符号付き整数型を指定します N, 、パディングビットなし、2 の補数表現。したがって、 int8_t は、ちょうど 8 ビットの幅を持つ符号付き整数型を示します。
  2. typedef 名前 uintN_t 幅のある符号なし整数型を指定します N. 。したがって、 uint24_t は、ちょうど 24 ビットの幅を持つ符号なし整数型を示します。
  3. これらのタイプはオプションです。ただし、実装が幅 8、16、32、または 64 ビットの整数型を提供し、パディング ビットがなく、(符号付き型の場合) 2 の補数表現を持つ場合は、対応する整数型を定義する必要があります。 typedef 名前。

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

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

それはコンパイラに大きく依存します。 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;
}

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

また、いくつかのグラフ計算機は8ビットプロセッサを使用しており、これらもかなり近代的なものと呼んでいます。

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top