是否有任何 C 的非二进制补码实现?
Posted
技术标签:
【中文标题】是否有任何 C 的非二进制补码实现?【英文标题】:Are there any non-twos-complement implementations of C? 【发布时间】:2012-08-29 21:48:09 【问题描述】:As we all no doubt know,ISO C 标准(以及 C++,我认为,虽然我对 C 方面更感兴趣)允许有符号数字的三种底层表示:
二进制补码; 个数的补码;和 符号/大小。***的条目指出,符号/大小在 60 年代的 IBM 7090 上使用,而 PDP-1、CDC 160A 和 UNIVAC 1100 使用的是补码,所有这些都可以追溯到 60 年代。
是否有任何其他具有这些替代表示的 C (或底层硬件)实现,比五十年前更近一些(它们是什么)?
将某些东西保留在不再存在的机器标准中似乎有点浪费。
【问题讨论】:
“是的,有人知道非补码实现”是否有资格作为答案? :-) @KerrekSB:只有当你能用证据证明这一点时...... :-) @KerrekSB:用“它们是什么”更新了问题,以说明这一点:-) 请注意,从标准中删除非 2 的补码会完全破坏我对所有“你如何看待这个有点玩弄的盛会?”的股票反应。问题,这是为了快速确认它们不适用于 1s 的补码负数。因此,我要么坚决反对,要么坚决支持,但我不确定是哪一个。 见Exotic architectures the standard committee cares about 【参考方案1】:我没有任何确凿的证据表明不存在,但我从未见过。据我所知,所有非二进制补码硬件早在 C 标准化之前就已经过时了。
也许收集证据的最佳方式是在与非二进制补码系统相关的标准中寻找相互冲突的要求和其他明显的错误。如果从未创建过这样的实现,则规范中可能存在疏忽,当有人真正尝试实现时,这些疏忽就会变得明显。
【讨论】:
或者彻底做到这一点:用最少的字节码编写一个虚拟机,并使用 1 的补码和/或符号幅度。如果它们中的任何一个具有名义上的支持,则为它实现一个 GCC 或 LLVM 后端,或者如果没有,则为它实现一个完整的 C 实现。这既回答了问题(“是的,我现在知道非 2 的补码实现”),并且如果标准确实存在疏忽,则有机会提交考虑过的缺陷报告。如果任何缺陷是关键的,那么在下一个标准中强制要求 2 的补充就是弹药。 @SteveJessop:这是一种很酷的方法,但它可能比通常回答 SO 问题的工作要多一些 ;-) @JoachimSauer:我承认我个人对此无能为力。 @ams:我的目标没有操作系统,它只是一些玩具字节码解释器。但是,如果 GCC 假设 2 的补码,那么这对我的假设项目没有好处。 我猜 GCC 至少假定二进制补码和 8 位字节。好吧,我只想说“定义”而不是“假设”,因为由编译器来定义这些概念。即使在打算执行符号/mag 或反码的机器上,编译器也可以轻松地选择提供二进制补码环境,只需使用无符号算术指令而不是有符号指令......【参考方案2】:我能找到的最新示例是UNISYS 2200 系列,它基于 UNIVAC,带有补码算法。 1986 年至 1997 年间生产了各种型号,但操作系统仍在积极开发中as late as 2015。他们还有一个 C 编译器,如 here 所示。
它们看起来很可能今天仍在使用。
【讨论】:
出于兴趣,Unisys 2200 用于是什么?更换运行关键任务遗留应用程序的破旧 Univacs,还是有新的发展? Unisys 直到去年(2011 年)才提供hardware running OS2200。 根据***,OS 2200 的最新版本是 2010 年的。 OS 2200 的 C 编译器在其“反码模式”中似乎不符合标准,最大无符号值 (UINT_MAX) 为2^N-2
not 2^N-1
。看起来这样做是为了在不更改位模式的情况下将有符号整数转换为无符号整数时,0x3FFFF 或负零不是有效值。 (C99 和 C11,也就是说,它可能符合 C89,但只是以 没有法律禁止它的方式,很明显 unsigned 应该做什么是。)
即使编译器在 2015 年更新,它似乎也不符合 C89 之后的任何标准;除其他外,它没有任何长度超过 36 位的无符号类型。以上是关于是否有任何 C 的非二进制补码实现?的主要内容,如果未能解决你的问题,请参考以下文章