小智 14
我在遥测领域工作,我们的一些客户拥有旧的模数转换器,仍然使用1的补码.我不得不在前几天编写代码,将1的补码转换为2的补码,以便进行补偿.
所以,是的,它仍然在那里(但你不会经常遇到它).
Ada*_*ile 12
这一切都归结为了解你的根源.
是的,这在技术上是一种旧技术,我可能会做其他人在该问题中建议的内容,并使用模数(%)运算符来确定奇数或偶数.但是要了解1s补码(或2s补码)总是一件好事.无论你是否曾经使用它们,你的CPU总是在处理这些事情.因此理解这个概念永远不会有害.现在,现代系统使得你通常不必担心这样的事情,因此它已经成为编程101课程的主题.但你必须记住,有些人实际上仍会在"现实世界"中使用它......例如,与流行的看法相反,有些人仍在使用汇编! 并不多,但在CPU能够理解原始C#和Java之前,有人仍然需要了解这些东西.
哎呀,你永远都不知道什么时候你可能会发现你的自己做了一些你真正需要进行二进制数学运算的东西,并且1s补码可以派上用场.
Jos*_*ver 12
RFC 791第14页将IP头校验和定义为:
校验和字段是报头中所有16位字的一个补码和的16位补码.出于计算校验和的目的,校验和字段的值为零.
因此,在现实世界中,在发送的每个IP数据包中仍然大量使用补充.:)
我从来没有遇到过一个人的补充系统,只要你有,我就一直在编码.
但我确实遇到了9的补充系统 - HP-41c计算器的机器语言.我承认这可以被认为是过时的,我不认为他们曾经有过这样的C编译器.
有趣的是,人们在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
Run Code Online (Sandbox Code Playgroud)
值得注意的是,它默认情况下也支持不符合unsigned int和unsigned long,范围从0 ... 2³? - 2,但可以0 ... 2³? - 1使用pragma 更改为.