C 是一';这是对现实世界问题的补充,还是仅仅是历史问题?

C 是一';这是对现实世界问题的补充,还是仅仅是历史问题?,c,history,numerical,C,History,Numerical,当被问及如何确定C语言中的奇数/均匀度时,惯用的(x&1)方法被正确地标记为不适用于系统,这是C标准所允许的 系统真的存在于计算机博物馆之外的“真实世界”中吗?我从20世纪70年代开始编写代码,我很确定我从未见过这样的野兽 有人真的在为这样一个系统开发或测试代码吗?如果没有,我们是应该担心这些事情呢,还是应该把它们和纸带和穿孔卡片一起放进去呢?我从来没有遇到过一个人的补码系统,我和你一样一直在编码 但我确实遇到了9的补码系统——HP-41c计算器的机器语言。我承认这可能被认为是过时的,而且我认为

当被问及如何确定C语言中的奇数/均匀度时,惯用的(x&1)方法被正确地标记为不适用于系统,这是C标准所允许的

系统真的存在于计算机博物馆之外的“真实世界”中吗?我从20世纪70年代开始编写代码,我很确定我从未见过这样的野兽


有人真的在为这样一个系统开发或测试代码吗?如果没有,我们是应该担心这些事情呢,还是应该把它们和纸带和穿孔卡片一起放进去呢?

我从来没有遇到过一个人的补码系统,我和你一样一直在编码


但我确实遇到了9的补码系统——HP-41c计算器的机器语言。我承认这可能被认为是过时的,而且我认为他们从来没有为这些设计过C编译器。

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


见鬼,你永远不知道什么时候你会发现自己在做一些事情,实际上你需要执行二进制数学,而1s补码可能会派上用场。

去年某个时候,我们离开了上世纪60年代,这使它成为我们现场最古老的机器。这是两个人的补充。这并不是说知道或意识到自己的补语是一件坏事。只是,你可能永远不会遇到今天的补语问题,不管你在工作中做了多少计算机考古学


在整数方面,您更可能遇到的问题是问题(我正在关注您)。此外,与整数格式相比,您将遇到更多的“现实世界”(即今天)问题。

我在遥测领域工作,我们的一些客户使用的是仍然使用1补码的旧式模数转换器。前几天我只需要编写代码,将1的补码转换为2的补码,以进行补偿


是的,它仍然存在(但你不会经常碰到它)。

我在80年代使用的CDC Cyber 18是1s补码机,但那是近30年前的事了,从那以后我再也没有见过它了(不过,那也是我最后一次在非PC上工作)

RFC 791 p.14将IP头校验和定义为:

校验和字段是报头中所有16位字的补码和的16位一的补码。为了计算校验和,校验和字段的值为零

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

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

是的,它还在用。它甚至被用于现代英特尔处理器。摘自2A,第3-8页:

3.1.1.8说明部分

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

描述部分可能使用的术语摘要:
*传统SSE:指SSE、SSE2、SSE3、SSE3、SSE4、AESNI、PCLMULQDQ和任何引用XMM寄存器并编码为无VEX前缀的未来指令集。
*维克斯。指定源寄存器或目标寄存器的VEX位字段(以1的补码形式)。
*rm_字段:ModR/M r/M字段和任何REX.B的缩写
*reg_字段:ModR/M reg字段和任何REX.R的简写


有趣的是,人们在1993年问了同样的问题,没有人能指出当时使用过的补码机


因此,是的,我想我们可以自信地说,一个补语属于我们历史的一个黑暗角落,几乎已经死亡,不再是一个问题。

我决定找到一个。Unisys ClearPath系统有一个ANSIC编译器(是的,他们称之为“美国国家标准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

值得注意的是,默认情况下,它还支持不一致的
无符号int
无符号long
,范围为
0…2³⁶ - 2
,但可以更改为
0…2³⁶ - 1
带一个pragma。

谢谢。完全同意你需要学习它,但你不应该担心它-比如6位字节,以及核心内存是如何工作的。顺便说一句,它是“补充”,而不是“赞美”。赞美可以是“这是你今天戴的一个很好的标志位”.我用Steve Yegge的五个领域()采访了很多软件工程师,你最好相信其中一个领域是位和字节。如果你想成为一名优秀的SDE,你必须理解二进制数系统,1和2的补码就是其中的一部分。我希望任何像样的计算机科学课程都能在计算机组织课程中涵盖这一点@ RoDDy:C或C++中实际上不允许6位字节:字节中的最小比特数(C/C++定义为<代码> sichof(char)< /C> >)为8。@ DavidStone实际上是代码>