私はとても混乱してい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 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
移植性が高くなります。
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;