有没有不采用二进制补码的C语言实现?

52

我们毫无疑问都知道,ISO C标准(以及C++,但我更关注C)允许使用三种有符号数的底层表示方式:

  • 二进制补码;
  • 二进制反码;和
  • 符号/大小。

维基百科的条目指出,符号/大小用于上世纪60年代IBM 7090机器,而二进制反码则被PDP-1、CDC 160A和UNIVAC 1100所使用,这些机器同样可以追溯到60年代。

除了这些已经过时的机器外,是否还有其他实现C语言(或底层硬件)的系统采用了这些替代表示方法?如果有,它们比五十年前的机器更新一些吗?(如果有的话)它们是什么?

保留这些已经不存在的机器的标准似乎有点浪费。


1
“是的,有人知道非二补码实现”是否算作答案呢? :-) - Kerrek SB
3
只有当你能提供证据支持时才可以这样说... :-) - R.. GitHub STOP HELPING ICE
1
@KerrekSB:更新了问题并加上了“它们是什么”,使得这一点无关紧要 :-) - paxdiablo
11
请注意,如果从标准中删除非二进制补码,那将完全破坏我对所有“你对这种位操作的看法是什么?”问题的常规回答,这个回答通常会迅速确认它们对1s'补码负数无效。因此,我要么坚决反对它,要么坚决支持它,但我不确定哪种立场更合适。 - Steve Jessop
11
请参阅标准委员会关注的异构架构 - Bo Persson
1
@SteveJessop,我很遗憾地通知您,根据N2412文档的最新草案(http://www.open-std.org/jtc1/sc22/wg14/www/docs/n2596.pdf),现在需要使用二进制补码表示。 - texdr.aft
2个回答

40
我能找到的最新例子是基于UNIVAC的UNISYS 2200系列,使用一补数算法。这些不同型号的机器在1986年至1997年之间生产,但操作系统仍在2015年活跃开发中。它们还有一个C编译器,可以在这里看到。看起来它们可能今天仍在使用中。

7
有趣的是,Unisys 2200是用来做什么的?是为了替换那些运行关键遗留应用程序的老旧Univac,还是有新的开发? - Steve Jessop
2
Unisys去年(2011年)仍提供运行OS2200的硬件。 - Bo Persson
1
根据维基百科,OS 2200的最新版本是2010年发布的。 - Fred Foo
4
OS 2200的C编译器在其"ones complement模式"下似乎不符合标准,最大无符号值(UINT_MAX)为2^N-2而不是2^N-1。看起来是这样做的,以便在将带符号整数强制转换为无符号整数时,0x3FFFF或负零不是有效值,而不改变位模式。(对于C99和C11,它可能符合标准,但只是在没有违法的情况下。很明显无符号值应该是什么。) - user3710044
2
即使编译器在2015年进行了更新,它似乎仍不符合C89标准之后的任何标准;除此之外,它没有任何超过36位的无符号类型。 - supercat
显示剩余3条评论

6

我没有确凿的证据证明不存在,但我从未见过这样的东西。 据我所知,在C语言标准化之前,所有非二进制补码硬件都已经过时了。

也许收集证据最好的方法是寻找与非二进制补码系统相关的冲突要求和其他明显的错误。 如果从未创建过这样的实现,则很可能在规范中存在疏漏,当有人实际尝试创建时就会变得显而易见。


10
要彻底解决这个问题,可以编写一个使用最少字节码和使用1s' complement和/或sign-magnitude的虚拟机。如果GCC或LLVM其中一个有名义支持,请为其实现后端;如果没有,请进行完整的C语言实现。这既回答了问题(“是的,我现在知道一种非2补码实现”),又提供了机会提交经过考虑的缺陷报告,如果标准确实存在疏漏,就可以动用这些报告来强制执行2's complement在下一个标准中。 - Steve Jessop
9
这是一种很酷的方法,但可能需要比通常回答 Stack Overflow 问题时更多的工作。 - Joachim Sauer
3
@JoachimSauer:我承认我个人对此不感兴趣。 - Steve Jessop
2
@ams:我的目标没有操作系统,只是一些玩具字节码解释器。但如果GCC假定二进制补码,那么对于我的假设项目来说就不好了。 - Steve Jessop
4
我猜想GCC至少默认使用二进制补码和8位字节。其实,我更倾向于使用“定义”这个词,因为编译器需要定义这些概念。即使在一个本来应该使用符号/幅度或补码的机器上,编译器也可以轻松地通过使用无符号算术指令而非有符号算术指令来提供二进制补码环境。 - R.. GitHub STOP HELPING ICE
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接