Để đi vào lý do tại sao size_tcần phải tồn tại và làm thế nào chúng ta đến đây:
Theo thuật ngữ thực dụng size_tvà ptrdiff_tđược đảm bảo rộng 64 bit khi triển khai 64 bit, rộng 32 bit khi triển khai 32 bit, v.v. Họ không thể ép bất kỳ loại hiện có nào có nghĩa là, trên mọi trình biên dịch, mà không phá vỡ mã kế thừa.
Một size_thoặc ptrdiff_tkhông nhất thiết phải giống như một intptr_thoặc uintptr_t. Chúng khác nhau về các kiến trúc nhất định vẫn còn được sử dụng khi size_tvà ptrdiff_tđược thêm vào Tiêu chuẩn vào cuối những năm 80 và trở nên lỗi thời khi C99 thêm nhiều loại mới nhưng chưa biến mất (như Windows 16 bit). X86 ở chế độ được bảo vệ 16 bit có bộ nhớ được phân đoạn trong đó mảng hoặc cấu trúc lớn nhất có thể có kích thước chỉ 65.536 byte, nhưng farcon trỏ cần phải rộng 32 bit, rộng hơn các thanh ghi. Trên những cái đó, intptr_tsẽ có chiều rộng 32 bit nhưng size_tvàptrdiff_tcó thể rộng 16 bit và vừa vặn trong một thanh ghi. Và ai biết loại hệ điều hành nào có thể được viết trong tương lai? Về lý thuyết, kiến trúc i386 cung cấp mô hình phân đoạn 32 bit với các con trỏ 48 bit mà chưa có hệ điều hành nào thực sự sử dụng.
Loại bù bộ nhớ không thể là longdo có quá nhiều mã kế thừa giả định longchính xác là rộng 32 bit. Giả định này thậm chí đã được tích hợp vào API UNIX và Windows. Thật không may, rất nhiều mã kế thừa khác cũng cho rằng một mã longđủ rộng để chứa một con trỏ, một tệp bù, số giây đã trôi qua kể từ năm 1970, v.v. POSIX hiện cung cấp một cách tiêu chuẩn hóa để buộc giả định sau là đúng thay vì giả định trước, nhưng cũng không phải là giả định di động để thực hiện.
Không thể nào intvì chỉ một số ít trình biên dịch trong thập niên 90 tạo ra int64 bit. Sau đó, họ thực sự trở nên kỳ lạ bằng cách giữ long32 bit rộng. Bản sửa đổi tiếp theo của Tiêu chuẩn tuyên bố nó bất hợp pháp vì intrộng hơn long, nhưng intvẫn rộng 32 bit trên hầu hết các hệ thống 64 bit.
Không thể long long int, dù sao nó đã được thêm vào sau đó, vì nó được tạo ra có chiều rộng tối thiểu 64 bit ngay cả trên các hệ thống 32 bit.
Vì vậy, một loại mới là cần thiết. Ngay cả khi nó không, tất cả các loại khác có nghĩa là một cái gì đó khác với phần bù trong một mảng hoặc đối tượng. Và nếu có một bài học từ sự chuyển đổi từ 32 đến 64 bit, thì đó là cụ thể về các thuộc tính mà một loại cần có, và không sử dụng một thuộc tính có nghĩa là những thứ khác nhau trong các chương trình khác nhau.
intnếusome_sizeđược ký,size_tnếu nó không được ký.