size_t から unsigned int に変換すると、オーバーフローが発生する可能性はありますか?
size_t x = foo ( ) ; // foo ( ) returns a value in type size_t
unsigned int ux = (unsigned int ) x ;
ux == x // Is result of that line always 1 ?
言語: C++
プラットフォーム: 任意
size_t から unsigned int に変換すると、オーバーフローが発生する可能性はありますか?
size_t x = foo ( ) ; // foo ( ) returns a value in type size_t
unsigned int ux = (unsigned int ) x ;
ux == x // Is result of that line always 1 ?
言語: C++
プラットフォーム: 任意
はい、可能です。必ずしも同じサイズである必要はsize_t
ありint
ません。実際には、64bitsize_t
と 32bitがあるのは非常に一般的int
です。
C++11 ドラフト N3290 では、§18.2/6 で次のように述べています。
型size_tは、任意のオブジェクトのバイト単位のサイズを格納するのに十分な大きさの実装定義の符号なし整数型です。
unsigned int
一方、0 から( C 標準ヘッダーUINT_MAX
で定義され、それに続く) までの値を格納できることだけが要求されます。これは、少なくとも 65535 (2 16 -1) であることが保証されているだけです。<climits>
<limits.h>
はい、一部のプラットフォームではオーバーフローが発生する可能性があります。たとえば、size_t
は として定義できますがunsigned long
、これは よりも簡単に大きくなる可能性がありますunsigned int
。