22

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

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

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

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

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

4

8 に答える 8

43

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

int8_t
uint8_t
int32_t
uint32_t

等...

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

これらの正しい typedef は、コンパイルするプラットフォームの stdint.h で利用できるはずです。これらを使用すると、素敵で移植可能なコードを書くことができます :-)

于 2009-08-05T06:06:36.557 に答える
17

ほとんどのプラットフォームでは常に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_tuintN_t:


  1. このtypedef名前は、 width 、パディング ビットなし、および 2 の補数表現をintN_t持つ符号付き整数型を指定します。Nしたがって、int8_t正確に 8 ビット幅の符号付き整数型を示します。
  2. 名前は width の符号なし整数型を指定しtypedefます。したがって、正確に 24 ビット幅の符号なし整数型を示します。uintN_tNuint24_t
  3. これらのタイプはオプションです。ただし、実装が、幅が 8、16、32、または 64 ビットで、パディング ビットがなく、2 の補数表現を持つ (符号付きの型の場合) 整数型を提供する場合、対応するtypedef名前を定義する必要があります。
于 2009-08-05T04:22:11.307 に答える
9

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

于 2009-08-05T05:54:17.720 に答える
4

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

于 2009-08-05T05:16:51.803 に答える
2

コンパイラに大きく依存します。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;
}
于 2009-08-05T04:11:13.917 に答える
1

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

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

于 2009-08-05T07:17:02.560 に答える
1

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

あなたが書いたほとんどのコードは、DSP で実行されることはないと安全に想定できます。しかし、すべてではないかもしれません。

于 2009-08-05T12:04:33.837 に答える
0

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

于 2009-08-05T12:22:41.783 に答える