是否有任何C语言的非twos补码实现? ,ISOC标准(和C++,我认为,虽然我对C方面更感兴趣)允许三个符号符号的下面表示: 二者互补 一的补语;及 符号/大小

是否有任何C语言的非twos补码实现? ,ISOC标准(和C++,我认为,虽然我对C方面更感兴趣)允许三个符号符号的下面表示: 二者互补 一的补语;及 符号/大小,c,language-lawyer,iso,negative-number,representation,C,Language Lawyer,Iso,Negative Number,Representation,Wikipedia的条目指出,符号/幅度从60年代开始在IBM 7090上使用,而PDP-1、CDC 160A和UNIVAC 1100也使用一个的补码,所有这些都可以追溯到60年代 有没有其他的C语言(或底层硬件)实现与这些替代的表示形式,这些表示形式是在50年前刚刚出现的(它们是什么) 将某些东西保留在不再存在的机器的标准中似乎有点浪费。我没有任何确凿的证据证明这些东西不存在,但我从未见过。据我所知,早在C标准化之前,所有非twos补码硬件就已经过时了 也许收集证据的最佳方法是在与非twos补

Wikipedia的条目指出,符号/幅度从60年代开始在IBM 7090上使用,而PDP-1、CDC 160A和UNIVAC 1100也使用一个的补码,所有这些都可以追溯到60年代

有没有其他的C语言(或底层硬件)实现与这些替代的表示形式,这些表示形式是在50年前刚刚出现的(它们是什么)


将某些东西保留在不再存在的机器的标准中似乎有点浪费。

我没有任何确凿的证据证明这些东西不存在,但我从未见过。据我所知,早在C标准化之前,所有非twos补码硬件就已经过时了


也许收集证据的最佳方法是在与非twos补充系统相关的标准中寻找相互冲突的需求和其他直接的bug。如果从来没有创建过这样的实现,那么很可能在规范中有疏忽,当有人真正尝试创建一个时,这些疏忽会变得明显。

我能找到的最新示例是基于UNIVAC的系列,带有一个补码算法。各种型号在1986年至1997年间生产,但操作系统仍在积极开发中。他们还有一个C编译器,如图所示


它们似乎在今天仍在使用。

是的,有人知道非二的补码实现”是否可以作为答案?:-)@KerrekSB:除非你能用证据证明…:-)@KerrekSB:用“它们是什么”来补充这个问题,使这一点变得毫无意义:-)请注意,从标准中删除非2的补码将完全破坏我对所有“你觉得这个无聊的大杂烩怎么样?”问题的反应,即快速确认它们不适用于1的补码负数。因此,我要么坚决反对,要么坚决赞成,但我不确定是哪一种。请参阅或彻底执行此操作:使用最小字节码编写VM,并使用1的补码和/或符号大小。如果其中任何一个支持GCC或LLVM后端,则为其实现GCC或LLVM后端;如果没有,则为其实现完整的C实现。这两种方法都回答了这个问题(“是的,我现在知道非2的s-complete实现”),并且如果标准确实存在疏忽,则提供了提交经过考虑的缺陷报告的机会。如果有任何缺陷是关键性的,那么在下一个标准中强制要求2的补充是有根据的。@SteveJessop:这是一个很酷的方法,但在回答一个如此问题时,可能比通常需要稍微多做一些工作;-)@JoachimSauer:我承认我个人不会为它烦恼。@ams:我的目标没有操作系统,它只是一个玩具字节码解释器。但是如果GCC假设2的补码,那么当然,这对我假设的项目没有好处。我猜GCC假设2的补码和至少8位字节。与其说是“假设”,不如说是“定义”,因为这些概念是由编译器定义的。即使是在一台打算进行符号/mag或1补码的机器上,编译器也可以很容易地选择仅通过使用无符号算术指令而不是有符号算术指令来提供2补码环境……出于兴趣,Unisys 2200的用途是什么?更换运行关键任务遗留应用程序的破旧Univacs,还是有新的开发?Unisys最晚于去年(2011年)推出。据维基百科称,最新版本的是2010年的。OS 2200的C编译器在其“一补模式”(最大无符号值(UINT_MAX))中似乎不符合标准是
2^N-2
不是
2^N-1
。看起来这样做是为了在不更改位模式的情况下将有符号整数转换为无符号整数时,0x3FFFF或负零不是有效值。(C99和C11,也就是说,它可能符合C89,但只有在没有法律禁止它的情况下,它很明显是一个未签名的预期。)即使编译器在2015年更新,它似乎也不符合任何超过C89的标准;除其他外,它没有任何长度超过36位的无符号类型。