【问题标题】:What's the real size of `size_t`, `uintptr_t`, `intptr_t` and `ptrdiff_t` type on 16-bit systems using segmented addressing mode?在使用分段寻址模式的 16 位系统上,`size_t`、`uintptr_t`、`intptr_t` 和 `ptrdiff_t` 类型的实际大小是多少?
【发布时间】:2016-04-03 13:04:58
【问题描述】:

嗯,C 编程语言中定义的size_tuintptr_tintptr_tptrdiff_t 类型真的让我很困惑。

我注意到在使用flat memory mode32位系统上,以上四种类型的实际大小是:

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

而在64位系统上使用flat memory mode,以上四种类型的实际大小为:

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

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

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

【问题讨论】:

  • 你不应该在操作系统博物馆从事这项工作;)
  • “但我找不到合适的 C 语言编译器来测试和验证真正的答案。” - 我想你会发现 Windows 3.1 早于这些标准伪类型。
  • 回到 windows 3.1 和 dos 3.x...6.x 天,x86..286 的内存模型被明确地建模。编译器意识到了这一点。 Borland C++ (2.x...3.x) 和 MSVC 都具有相似的内存模型类,您可以选择通用来编译您的程序(使用大、小、巨大...)内存模型进行编译。或者您可以沉迷于#pragma 狂欢来进行细粒度控制。
  • 在一个很远很远的标签里......

标签: c++ c windows


【解决方案1】:

real modesize_tptrdiff_t 中是16 位类型。指针的大小取决于它是否为near, far, or huge 指针。 Near 指针有 16 位,其他 32 位。 intptr_tuintptr_t 只是在 C99 的后期才定义的。

【讨论】:

  • 我想,当时连<stdint.h>都没有。
  • @BitTickler 如果我们回到足够远的地方,也没有实模式。也就是说,它不被称为实模式。当然,8086 处理器所做的一切都是“真实的”;无需提及。 :)
  • @nwellnhof 您确定size_tptrdiff_t 不依赖于为程序选择的内存模型吗?我用过这个东西,但记不太清了。
  • @Kaz 我不是 100% 确定,但我认为即使在巨大的模型中它们也是 16 位的。 AFAIK,巨大的模型不允许 32 位数组索引或超过 64K 元素的数组。不过,您可以分配总大小超过 64 KB 的数组。
【解决方案2】:

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

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

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

(强调原文。)

unsigned int 的大小为 16 位,与内存模型无关。

(您询问的其他类型都不存在,或者,如果存在,则此特定编译器不支持。)

【讨论】:

  • Turbo C++ 有 5 种不同的内存模型,它们的大小各不相同
  • @M.M:指针的大小因内存模型而异。 size_t 的大小没有,至少手册上没有。
  • @BitTickler:这个问题的答案连提及 size_t
猜你喜欢
  • 2015-10-10
  • 1970-01-01
  • 2010-12-07
  • 2020-09-08
  • 2019-01-26
  • 2011-08-13
  • 2018-05-08
  • 2019-04-22
相关资源
最近更新 更多