算术规则是否适用于C中的加法?

时间:2014-09-19 06:36:11

标签: c computer-science

我是C的新手,我很难理解这些材料。我真的需要帮助!请有人帮忙。

在算术中,任何两个正整数的总和都比以前要好:

(n+m) > n for n, m > 0
(n+m) > m for n, m > 0

C有一个加法运算符+。此算术规则是否在C?

中保留

我知道这是假的。但是可以请有人向我解释为什么这样,我能理解吗?请提供反例?

提前谢谢。

3 个答案:

答案 0 :(得分:7)

(我不会为你解决这个问题,但会提供一些指示。)

由于不同的原因,对于整数和浮点运算都是错误的。

答案 1 :(得分:4)

它并不成立,因为C的整数不是"抽象的"无限大小的整数,即真正的整数(在数学中)。

在C中,整数是离散的和数字的,并且使用固定数量的位来实现。这会导致范围有限,并且当您(尝试)超出范围时会出现问题。通常整数将换行,这是非常自然的"。

答案 2 :(得分:0)

我简短的搜索没有显示描述这些的好答案,所以我宁愿在这里很好地回答这个问题,对于初学者来说。

当然,答案是错误的,但为什么会这样呢?

<强>整数

在C或任何提供某种整数类型的编程语言中,这种类型并不意味着它在数学意义上。在数学意义上,非负整数的范围从0到无穷大。然而,计算机只有有限的存储空间,因此整数必然会被限制在小于无穷大的范围内。

仅此一项证明a + b > aa + b > b不能一直为真,因为它可以设置,因此ab都小于最大值计算机可以在其存储中表示的数字,但a + b大于该数字。

这里到底发生了什么,取决于。有人提到环绕,但情况并非如此。 C语言首先将整数溢出定义为未定义行为,如果代码恰好踩到它上,可能会发生包括火和烟在内的任何事情(当然在现实中不会发生了,但严格地解释标准,以及违反时空连续体。)

我不会描述环绕如何在这里工作,因为它超出了问题本身的范围。

浮点

这里的情况与整数的情况大致相同:理解为什么数学不能完全适用的关键是计算机的存储空间有限。

计算机内存中的浮动数字与科学记数法很相似:尾数和指数。 这两个具有固定的有限范围,具体取决于浮点变量的类型。

在基数10中,你可以设想这个,就像你的指数范围从10 ^ -1010 ^ 10,并且尾数在小数点后面有4个小数位,总是标准化。

考虑到这一点,请检查以下示例添加:

1.2345 * (10 ^ 0) + 1.0237 * (10 ^ 5)
5.2345 * (10 ^ 10) + 6.7891 * (10 ^ 10)

第一个是一个例子,其中结果将等于其中一个输入数字,而两者都大于零。第二个是结果超出范围的例子。

然而,计算机使用的浮点表示能够表示 infinity ,其中两个表示:正无穷大负无穷大。因此,虽然第一个示例作为证明传递,但第二个示例没有,因为该添加的结果是正无穷

但考虑到这一点,您可以制作另一个校对示例:

3.1416 * (10 ^ 0) + (+ infinity)

当然结果是正无穷,无论你把它添加到什么地方。当然正无穷不大于正无穷,所以再次证明。