size_tとunsigned intの違いは?


107

私はとても混乱していsize_tます。私はインターネットで検索しましたが、どこでもsize_t符号なしの型であるため、負ではない値しか表すことができません。

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

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

そして、誰かが私size_tにその良い例を簡単に教えてくれますか?


5
typedef /*This part is implementation dependent */ size_t;
P0W 2013年

回答:


87

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

そのためunsigned intだけ符号なし整数型ではありません。size_tいずれかである可能性がありunsigned charunsigned shortunsigned intunsigned longまたはunsigned long long、実装に依存します。

2番目の質問は、size_tそれunsigned intが交換可能であるかどうかであり、そうでない場合はなぜですか?

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

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

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

おまけ:ここにsize_t(および密接に関連するptrdiff_tタイプについて)良い記事があります。なぜそれを使うべきか、それは非常によくわかります。


1
どのように正確にできsize_tますunsigned charか?これは規格で許可されていますか?つまり、誰がどのようにcalloc()(そして家族)を使用することを期待できるのstrlen()でしょうか?それは私にはばかげているようです。
プリフタン

size_t標準では「符号なし整数型」と定義されていると思いますが、のいずれかと同じである必要はありません unsigned {char, short, int, long, long long}
ポールハンキン

80

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

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

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

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

1つのシステムでは、unsigned intサイズを表すために使用することが理にかなっている場合があります。別の方法では、unsigned longまたはを使用する方が理にかなっていますunsigned long long。(またはのsize_t可能性は低いですが、unsigned charそれunsigned shortは許可されています)。

の目的は、サイズを表すためにどの定義済みの型が使用されるかsize_tについてプログラマーが心配する必要をなくすことです。

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


6
size_tを使用する理由を説明しているので、これは受け入れられる答えになると思います
kuchi

キース・トンプソン@ので、特定のタイプ(つまり、そのこれはどういう意味unsigned intunsigned longこと、など)size_tへの対応は、コードが実行されているマシンに依存?つまり、1つのマシンアーキテクチャでは対応しますunsigned intが、別のアーキテクチャでは対応しunsigned longます。
リッチー・トーマス

1
@RichieThomas:Cの実装に依存します。同じアーキテクチャ上の2つの異なるコンパイラは、のために、異なるタイプを選択する可能性がありますsize_t、特に場合は、例えば、unsigned longunsigned long long同じサイズです。
キーストンプソン、

@RichieThomasそれもその一部です。最大値と言うことであることlonglong longなどがシステムに依存しない:あなたが見て取ればlimits.h、あなたでしょう、少なくともUnix系OSの下でint型の最大値は、システムのワードサイズに依存していることがわかります。
プリフタン

1
@Pryftan Motorola 68000シリーズ、および古いIntel x86シリーズ(8086および8088に戻る)を見てください。
キース・トンプソン、

10

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

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

基本的な符号なし整数型の1つのエイリアス。

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

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


5
その引用はどこからですか?(C標準からのものではありません。)
キース・トンプソン

2
質問のタグはcです。C ++標準では、Cには何の関係もありません
IInspectable

7

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


4

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


いい視点ね。An appleリンゴ、a size_tサイズ ...
dom_beau

2

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です。


1
size_t単一のオブジェクトのサイズを保存できます。ポインターは、任意のオブジェクトの任意のバイトを指すことができます。たとえば、1つのオブジェクトのサイズを2 ** 32-1バイトに制限する64ビットのアドレス空間を持つシステムを使用できます。size_tuintptr_tが同じタイプであるという保証はありません。
キース・トンプソン

1

簡単に言うと、size_tはプラットフォームと実装に依存するのに対し、unsigned intはプラットフォームにのみ依存します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.