在使用分段寻址模式的16位系统上,“size_t”,“uintptr_t”,“intptr_t”和“ptrdiff_t”types的实际大小是多less?

那么,用C编程语言定义的size_tuintptr_tintptr_tptrdiff_ttypes真的令我困惑。

我注意到在使用平面内存模式的 32位系统上,以上四种types的实际尺寸是:

 sizeof(size_t) = sizeof(uintptr_t) = sizeof(intptr_t) = sizeof(ptrdiff_t) = 4 

在使用平坦内存模式的 64位系统上,以上四种types的实际尺寸是:

 sizeof(size_t) = sizeof(uintptr_t) = sizeof(intptr_t) = sizeof(ptrdiff_t) = 8 

但是,我仍然对使用分段寻址模式的 16位系统上这四种types的实际大小感到好奇。

根据Windows 3.1x ,Windows 3.1x是一系列的16位操作系统。 但我找不到合适的C语言编译器来testing和validation真正的答案。

在实模式下 , size_tptrdiff_t是16位类型。 指针的大小取决于它是近,远,还是巨大的指针。 近指针有16位,其他32位。 intptr_tuintptr_t只在C99后面定义。

这至少可能取决于你使用的编译器。

作为一个来自16位时代的数据点,Borland Turbo C ++ 3.0手册有这样的说法:

sizeof结果的整数类型是size_t ,在stddef.h中定义为unsigned int

(强调原文)

unsigned int的大小是16位,独立于内存模型。

(您询问的其他类型还没有存在,或者如果他们确实存在,则不受此特定编译器支持。)