web-dev-qa-db-ja.com

size_tとunsigned intの違いは?

私はsize_tについてとても混乱しています。インターネットで検索したところ、size_tは符号なしの型であるため、負でない値のみを表すことができると述べました。

私の最初の質問は、負でない値のみを表すために使用される場合、unsigned intの代わりにsize_tを使用しないのですか?

2番目の質問は、size_tunsigned intは交換可能かどうかです。そうでない場合、なぜですか?

size_tとその動作の簡単な例を教えてください。

78
Vikas Verma

負でない値を表すために使用される場合、unsigned intの代わりにsize_tを使用しない理由

unsigned intが唯一の符号なし整数型ではないためです。 size_tは、実装に応じて、unsigned charunsigned shortunsigned intunsigned long、またはunsigned long longのいずれかになります。

2番目の質問は、size_tunsigned intは互換性があるかどうかであり、そうでない場合はなぜですか?

上記の^^で説明した理由により、これらは互換性がありません。

そして、誰でもsize_tとその簡単な動作の良い例を教えてもらえますか?

私はあなたが「簡単な働き」で何を意味するのかよくわかりません。これは、他の符号なし型と同様に機能します(特に、型定義された型のように)。オブジェクトのサイズを記述するときは、size_tを使用することをお勧めします。特に、sizeof演算子およびstrlen()などのさまざまな標準ライブラリ関数は、size_tを返します。

ボーナス: これは良い記事ですsize_t(および密接に関連するptrdiff_tタイプ)について。それを使用する理由は非常によくわかります。

72
user529758

Cには5つの標準の符号なし整数型があります。

  • unsigned char
  • unsigned short
  • unsigned int
  • unsigned long
  • unsigned long long

サイズと範囲にさまざまな要件があります(簡単に言うと、各タイプの範囲は次のタイプの範囲のサブセットですが、一部の範囲は同じ範囲になっている場合があります)。

size_tは、いくつかの符号なしの型のtypedef(つまりエイリアス)です(おそらく上記のいずれかですが、おそらく拡張符号なし整数型ですが、そうではありません)。これは、sizeof演算子によって生成される型です。

1つのシステムでは、unsigned intを使用してサイズを表すのが理にかなっている場合があります。別の場合、unsigned longまたはunsigned long longを使用する方が理にかなっている場合があります。 (size_tunsigned charまたはunsigned shortになることはほとんどありませんが、許可されています)。

size_tの目的は、サイズを表すために事前定義されたタイプのwhichが使用されることを心配することからプログラマーを解放することです。

sizeofunsigned intを生成することを前提とするコードは移植できません。 size_tを生成することを前提とするコードは、移植性が高くなります。

59
Keith Thompson

size_tには特定の制限があります。

http://www.cplusplus.com/reference/cstring/size_t/ からの引用:

基本的な符号なし整数型のいずれかのエイリアス。

これは、オブジェクトのサイズをバイト単位で表すことができるタイプです:size_tは、sizeof演算子によって返されるタイプであり、標準ライブラリで広く使用されていますサイズとカウントを表すため。

intのサイズはデータモデルで指定されているため、unsigned intと交換できません。たとえば、LLP64は32ビットintを使用し、ILP64は64ビットintを使用します。

9
DrYap

size_tは、データオブジェクトのサイズを格納するために使用され、特定のC実装が作成できるデータオブジェクトのサイズを保持できることが保証されています。このデータ型は、小さい(ビット数)、大きい、またはunsigned intとまったく同じです。

他の回答とは別に、コードを文書化し、メモリ内のオブジェクトのサイズについて話していることを人々に伝えます

2
Ed Heal

size_t型は、C/C++言語の基本的な符号なし整数型です。これは、sizeof演算子によって返される結果のタイプです。タイプのサイズは、任意のタイプの理論的に可能な配列の最大サイズを格納できるように選択されます。 32ビットシステムでは、size_tは32ビット、64ビットでは64ビットになります。つまり、size_t型の変数は安全にポインターを格納できます。例外はクラス関数へのポインターですが、これは特別な場合です。 size_tはポインターを格納できますが、その目的には別の符号なし整数型uintptr_tを使用することをお勧めします(名前にはその機能が反映されています)。タイプsize_tおよびuintptr_tは同義語です。 size_t型は通常、ループカウンター、配列のインデックス付け、およびアドレス演算に使用されます。 size_t型の可能な最大値は定数SIZE_MAXです。

2
user2873459

簡単に言えば、size_tはプラットフォームに依存し、実装にも依存しますが、unsigned intはプラットフォームにのみ依存します。

0
Kaushal Billore