[我与一位记者讨论了各种问题,包括指针类型并非完全相同,以及指针转换可能涉及实际的类型转换。我把 Chris Torek 拉进了这场谈话,下面是他发言内容的摘录。]

发件人: Chris Torek
日期: 1994年11月5日 05:32:05 -0800
Message-Id: <199411051332.FAA11040@elf.bsdi.com>
主题: 回复: 问:如何将一个浮点数赋值给一个 (void) 数据?

我只想补充一两点 Steve 的信息……

>字寻址的机器绝非是假设性的。我
>永远记不清细节了,但我相信机器
>由 Data General、PR1ME 和/或 Cray 制造曾使用过这种
>方案,并且 C 编译器已为这些机器编写。
>(为这些机器编写代码,特别是将现有
>代码移植到这些机器,是对可移植指针使用的一次真正考验。)

我从未用过 Cray,但我认为上面的列表是正确的(即使不完整)。另一方面,我用过 Data General MV 系列的机器。这些机器有“字指针”和“字节指针”,其中字由两个字节组成。(这乍一看似乎很奇怪,因为机器有 32 位整数,但这归因于机器的历史;其指针格式是 DG Nova 上使用的格式的扩展,DG Nova 是一台 16 位字寻址的机器。Nova 也只有 8 个 ALU 操作,包括带借位的减法,但没有不带借位的减法。这是因为它们使用 74xx 系列 ALU,该 ALU 有 16 个操作,但指令中只剩下 3 位,因此它们将 ALU 操作数引脚之一硬接线为“1”。MV 系列修复了那个特定的烦人之处。)

在 DG 上,要将字指针转换为字节指针,你需要将字指针左移,引入一个 0 位作为“字节偏移”位。字指针的最高位是“间接”位;在转换过程中会丢失这个位。类似地,要将字节指针转换为字指针,你需要将字节指针右移,丢失字节偏移并引入一个 0 位作为“间接”位。这样的移位也会移动段和环位,而我已经记不清它们是否应该这样移位,还是存在一对特殊的移位指令可以保留这些位,只移动地址位。