Aby size_tdowiedzieć się, dlaczego musi istnieć i jak się tu dostaliśmy:
W kategoriach pragmatycznych size_ti ptrdiff_tsą gwarantowane do 64 bitów szerokości na realizację 64-bitowej, 32 bity szeroki na realizację 32-bitowej, i tak dalej. Nie mogli zmusić żadnego istniejącego typu, aby oznaczał to w każdym kompilatorze bez zerwania starszego kodu.
A size_tlub ptrdiff_tniekoniecznie jest taki sam jak intptr_tlub uintptr_t. Byli różni się w niektórych architekturach, które były nadal w użyciu, kiedy size_ti ptrdiff_tzostały dodane do standardowego w późnych latach 80., kiedy stają się przestarzałe i C99 dodano wiele nowych typów, ale jeszcze nie przeszły (takie jak 16-bitowym systemie Windows). 16-bitowy tryb chroniony x86 miał pamięć segmentową, w której największa możliwa tablica lub struktura mogła mieć jedynie 65 536 bajtów, ale farwskaźnik musiał mieć szerokość 32 bitów, więcej niż rejestry. Na nich intptr_tmiałby 32 bity szerokości, ale size_tiptrdiff_tmoże mieć 16 bitów szerokości i zmieścić się w rejestrze. A kto wiedział, jaki system operacyjny może zostać napisany w przyszłości? Teoretycznie architektura i386 oferuje 32-bitowy model segmentacji z 48-bitowymi wskaźnikami, których żaden system operacyjny nigdy nie używał.
Typ przesunięcia pamięci nie może być, longponieważ o wiele za dużo starszego kodu zakłada się, że longma on dokładnie 32 bity. To założenie zostało nawet wbudowane w interfejsy API UNIX i Windows. Niestety, wiele innych starszych kodów również zakładało, że a longjest wystarczająco szerokie, aby pomieścić wskaźnik, przesunięcie pliku, liczbę sekund, które upłynęły od 1970 roku i tak dalej. POSIX zapewnia teraz ustandaryzowany sposób na wymuszenie, aby to drugie założenie było prawdziwe zamiast pierwszego, ale nie jest to również przenośne założenie.
Nie mogło być tak, intponieważ tylko niewielka garść kompilatorów w latach 90. miała int64 bity szerokości. Potem naprawdę się dziwili, utrzymując longszerokość 32 bitów. Kolejna wersja Standardu uznała, że jest niezgodna z prawem, ponieważ intjest szersza niż long, ale intnadal ma 32 bity szerokości w większości systemów 64-bitowych.
Nie mogło być long long int, co zresztą zostało dodane później, ponieważ zostało utworzone tak, aby miało szerokość co najmniej 64 bitów, nawet w systemach 32-bitowych.
Potrzebny był więc nowy typ. Nawet gdyby tak nie było, wszystkie inne typy oznaczały coś innego niż przesunięcie w tablicy lub obiekcie. A jeśli była jedna lekcja z fiasku migracji od 32 do 64 bitów, to musiała być konkretna, jakie właściwości powinien mieć typ, a nie używać takiej, która oznaczała różne rzeczy w różnych programach.
intifsome_sizejest podpisane,size_tjeśli nie jest podpisane.