私はとても混乱していsize_tます。私はインターネットで検索しましたが、どこでもsize_t符号なしの型であるため、負ではない値しか表すことができません。
私の最初の質問は、非負の値のみを表すために使用する場合、unsigned int代わりに使用しないのはなぜsize_tですか?
私の2番目の質問です:あるsize_tとunsigned int交換可能かどうか?そうでない場合、なぜですか?
そして、誰かが私size_tにその良い例を簡単に教えてくれますか?
私はとても混乱していsize_tます。私はインターネットで検索しましたが、どこでもsize_t符号なしの型であるため、負ではない値しか表すことができません。
私の最初の質問は、非負の値のみを表すために使用する場合、unsigned int代わりに使用しないのはなぜsize_tですか?
私の2番目の質問です:あるsize_tとunsigned int交換可能かどうか?そうでない場合、なぜですか?
そして、誰かが私size_tにその良い例を簡単に教えてくれますか?
回答:
非負の値を表すために使用する場合、
unsigned int代わりに使用しない理由size_t
そのためunsigned intだけ符号なし整数型ではありません。size_tいずれかである可能性がありunsigned char、unsigned short、unsigned int、unsigned longまたはunsigned long long、実装に依存します。
2番目の質問は、
size_tそれunsigned intが交換可能であるかどうかであり、そうでない場合はなぜですか?
上記で説明した理由により、これらは互換性がありません^^。
そして、誰かが私にsize_tとその簡単な動作の良い例を教えてもらえますか?
私はあなたが「簡単な働き」であなたが何を意味しているのか全く理解できません。他の符号なし型と同様に機能します(特に、型指定された型と同様)。size_tオブジェクトのサイズを説明するときに使用することをお勧めします。特に、sizeof演算子と、などのさまざまな標準ライブラリ関数strlen()はを返しsize_tます。
おまけ:ここにsize_t(および密接に関連するptrdiff_tタイプについて)良い記事があります。なぜそれを使うべきか、それは非常によくわかります。
size_tますunsigned charか?これは規格で許可されていますか?つまり、誰がどのようにcalloc()(そして家族)を使用することを期待できるのstrlen()でしょうか?それは私にはばかげているようです。
size_t標準では「符号なし整数型」と定義されていると思いますが、のいずれかと同じである必要はありません unsigned {char, short, int, long, long long}。
Cには5つの標準の符号なし整数型があります。
unsigned charunsigned shortunsigned intunsigned longunsigned 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移植性が高くなります。
unsigned int、unsigned longこと、など)size_tへの対応は、コードが実行されているマシンに依存?つまり、1つのマシンアーキテクチャでは対応しますunsigned intが、別のアーキテクチャでは対応しunsigned longます。
size_t、特に場合は、例えば、unsigned longとunsigned long long同じサイズです。
long、long longなどがシステムに依存しない:あなたが見て取ればlimits.h、あなたでしょう、少なくともUnix系OSの下でint型の最大値は、システムのワードサイズに依存していることがわかります。
size_t 特定の制限があります。
http://www.cplusplus.com/reference/cstring/size_t/からの引用:
基本的な符号なし整数型の1つのエイリアス。
これは、オブジェクトのサイズをバイト単位で表すことができるタイプです。size_tは、sizeof演算子によって返されるタイプであり、サイズとカウントを表すために標準ライブラリで広く使用されています。
unsigned intのサイズはintデータモデルによって指定されているため、との互換性はありません。たとえば、LLP64は32ビットintを使用し、ILP64は64 ビットを使用しますint。
size_tは、データオブジェクトのサイズを格納するために使用され、特定のC実装が作成できる任意のデータオブジェクトのサイズを保持できることが保証されています。このデータ型は、小さい(ビット数)、大きい、またはunsigned intとまったく同じである場合があります。
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です。
size_t単一のオブジェクトのサイズを保存できます。ポインターは、任意のオブジェクトの任意のバイトを指すことができます。たとえば、1つのオブジェクトのサイズを2 ** 32-1バイトに制限する64ビットのアドレス空間を持つシステムを使用できます。size_tとuintptr_tが同じタイプであるという保証はありません。
typedef /*This part is implementation dependent */ size_t;