size_t
実装定義の符号なし整数型です。
size_t
値を否定すると、通常の unsigned modulo 動作の type の結果が得られる可能性があります。size_t
たとえば、size_t
が 32 ビットでsizeof(struct foo) == 4
、次に-sizeof(struct foo) == 4294967292
、または 2 32 -4 であると仮定します。
1 つ例外があります。単項-
演算子は、整数昇格(C) または整数昇格(C++) (これらは本質的に同じものです) をそのオペランドに適用します。size_t
が少なくとも と同じ幅の場合int
、このプロモーションは何もせず、結果のタイプは になりsize_t
ます。しかし、int
が より広い場合size_t
、INT_MAX >= SIZE_MAX
のオペランドはから に-
「昇格」さsize_t
れint
ます。そのありそうもないケースでは、-sizeof(struct foo) == -4
.
その値をsize_t
オブジェクトに代入すると、元の に変換されsize_t
、期待どおりの値が得られSIZE_MAX-4
ます。しかし、そのような変換がなければ、驚くべき結果が得られることがあります。
size_t
が よりも狭い実装について聞いたint
ことがないので、これに遭遇する可能性は低いです。しかし、潜在的な問題を説明するunsigned short
、仮想の狭い型の代用として使用するテスト ケースを次に示します。size_t
#include <iostream>
int main() {
typedef unsigned short tiny_size_t;
struct foo { char data[4]; };
tiny_size_t sizeof_foo = sizeof (foo);
std::cout << "sizeof (foo) = " << sizeof (foo) << "\n";
std::cout << "-sizeof (foo) = " << -sizeof (foo) << "\n";
std::cout << "sizeof_foo = " << sizeof_foo << "\n";
std::cout << "-sizeof_foo = " << -sizeof_foo << "\n";
}
私のシステム( 16-bit short
、 32-bit int
、および 64-bitsize_t
がある)の出力は次のとおりです。
sizeof (foo) = 4
-sizeof (foo) = 18446744073709551612
sizeof_foo = 4
-sizeof_foo = -4