一个人的补充是一个现实世界的问题,还是一个历史问题?

另一个问题是关于确定C中的奇数/偶数,并且惯用(x&1)方法被正确地标记为基于补体的系统被破坏,C标准允许。

系统真的存在于计算机博物馆之外的“现实世界”吗? 自1970年代以来,我一直在编码,我很确定我从未见过这样的野兽。

有人在为这样的系统开发或测试代码吗? 如果没有,我们应该担心这些事情,还是应该将它们与纸带和打卡一起放入101室 ?

这一切都归结为了解你的根源。
是的,这在技术上是一种古老的技术,我可能会做其他人在该问题中建议的内容,并使用模数(%)运算符来确定奇数或偶数。 但是要了解1s补码(或2s补码)总是一件好事。 无论你是否曾经使用它们,你的CPU总是在处理这些事情。 因此理解这个概念永远不会有害。 现在,现代系统使得你通常不必担心这样的事情,所以它已经成为编程101课程的主题。 但你必须记住,有些人实际上仍会在“现实世界”中使用它……例如,与流行的看法相反,有些人仍在使用汇编! 并不多,但在CPU能够理解原始C#和Java之前, 有人仍然需要了解这些东西。

哎呀,你永远不知道什么时候你可能会发现自己在做一些你真正需要进行二进制数学运算的东西,并且1s补码可以派上用场。

我在遥测领域工作,我们的一些客户拥有旧的模数转换器仍然使用1的补码。 我不得不在前几天编写代码,将1的补码转换为2的补码以补偿。

所以,是的,它仍然在那里(但你不会经常遇到它)。

RFC 791第14页将IP头校验和定义为:

校验和字段是标头中所有16位字的一个补码和的16位补码。 出于计算校验和的目的,校验和字段的值为零。

因此,在现实世界中,在发送的每个IP数据包中仍然大量使用补充。 🙂

我在80年代使用过的CDC Cyber​​ 18是一台1s补充机器,但差不多30年前,我从未见过一台(不过,这也是我最后一次在非PC上工作)

我从来没有遇到过一个人的补充系统,只要你有,我就一直在编码。

但我确实遇到了9的补充系统 – HP-41c计算器的机器语言。 我承认这可以被认为是过时的,我不认为他们曾经有过这样的C编译器。

去年的某个时候,我们使用了1960年代的Honeyboxen ,这使它成为我们现场最古老的机器。 这是两个补充。 这并不是说知道或意识到一个人的补充是件坏事。 只是,无论你在工作中做多少计算机考古,你今天可能永远不会碰到一个补充问题。

你更有可能在整数方面遇到的问题是endian问题(我正在看你PDP )。 此外,您将遇到浮点 格式比“整数格式”更多的“真实世界”(即今天)问题。

有趣的是,人们在1993年的comp.std.c上问同样的问题, 没有人能指出当时使用过的一台补充机器

所以,是的,我认为我们可以自信地说,一个人的补充属于我们历史的一个黑暗角落,几乎死了,不再是一个问题了。

我决定找一个。 Unisys ClearPath系统有一个ANSI C编译器(是的,他们称之为“美国国家标准C”,甚至PDF文档最后一次更新于2013年。该文档可在线获取 ;

签名类型都使用一个补码表示,具有以下属性:

 Type | Bits | Range ---------------------+------+----------------- signed char | 9 | -2⁸+1 ... 2⁸-1 signed short | 18 | -2¹⁷+1 ... 2¹⁷-1 signed int | 36 | -2³⁵+1 ... 2³⁵-1 signed long int | 36 | -2³⁵+1 ... 2³⁵-1 signed long long int | 72 | -2⁷¹+1 ... 2⁷¹-1 

值得注意的是,默认情况下,它还支持不符合条件的unsigned intunsigned long ,范围为0 ... 2³⁶ - 2 ,但可以使用pragma更改为0 ... 2³⁶ - 1

一个人的补充是一个现实世界的问题,还是一个历史问题?

是的,它仍然使用。 它甚至用于现代英特尔处理器。 从英特尔®64和IA-32架构软件开发人员手册 2A,第3-8页:

3.1.1.8描述部分

然后,每个指令由多个信息部分描述。 “描述”部分更详细地描述了指令和所需操作数的用途。

可能在说明部分中使用的术语摘要:
*传统SSE:指SSE,SSE2,SSE3,SSSE3,SSE4,AESNI,PCLMULQDQ以及任何引用XMM寄存器且未使用VEX前缀编码的任何未来指令集。
* VEX.vvvv。 指定源或目标寄存器的VEX位域(以1的补码forms)。
* rm_field:ModR / M r / m字段和任何REX.B的简写
* reg_field:ModR / M reg字段和任何REX.R的简写