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