質問
これは次の質問に関連していますが、
ほとんどのプラットフォームでは 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
:
- の
typedef
名前intN_t
幅のある符号付き整数型を指定しますN
, 、パディングビットなし、2 の補数表現。したがって、int8_t
は、ちょうど 8 ビットの幅を持つ符号付き整数型を示します。 - の
typedef
名前uintN_t
幅のある符号なし整数型を指定しますN
. 。したがって、uint24_t
は、ちょうど 24 ビットの幅を持つ符号なし整数型を示します。 - これらのタイプはオプションです。ただし、実装が幅 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 には、知りたいことのほとんどすべてが含まれています。