我是C的新手,很难理解这些材料。我真的需要帮助!请有人帮忙。
在算术中,任何两个正整数的和都大于任意一个:
(n+m) > n for n, m > 0
(n+m) > m for n, m > 0
C有一个加法运算符+。这个算术规则在C中成立吗?
我知道这是假的。但请有人向我解释为什么这样,我能理解吗?请提供反例?
提前谢谢。
(我不会为您解决这个问题,但会提供一些指针。)
由于不同的原因,整数和浮点运算都为false。
- 整数容易溢出
- 将非常小的浮点数
m
与非常大的数字n
相加将返回n
。读一读每一位计算机科学家应该知道的关于浮点运算的知识
它不成立,因为C的整数不像实数(在数学中)那样是"抽象的"无限大小的整数。
在C中,整数是离散的和数字的,并且使用固定数量的位来实现。这会导致范围有限,当你(试图)超出范围时会出现问题。通常,整数会换行,这是非常"不自然"的。
我的简短搜索并没有显示出描述这些问题的好答案,所以我宁愿在这里为初学者很好地回答这个问题。
答案当然是错误的,但为什么呢?
整数
在C或任何提供某种整数类型的编程语言中,这种类型并不意味着数学意义上的整数类型。在数学意义上,非负整数的范围从0到无穷大。然而,计算机的存储空间有限,因此整数必然被限制在小于无穷大的范围内。
仅凭这一点就证明了a + b > a
和a + b > b
不可能一直都是真的,因为它可以设置为a
和b
都小于计算机在其存储器中可以表示的最大数字,但a + b
大于这个数字。
这里到底发生了什么,取决于情况。有些人提到包装,但事实并非如此。C语言首先将整数溢出定义为一种未定义的行为,即如果代码碰巧踩到它,无论发生什么,包括火灾和烟雾,都可能发生(当然,在现实中这不会发生,但严格解释标准可能会发生,以及时空连续体的破坏)。
我不会在这里描述包装是如何工作的,因为它超出了问题本身的范围。
浮点
这里的情况与整数的情况相同:理解数学为什么不能完全应用于这里的关键是计算机的存储空间有限。
计算机内存中的浮点数的表示方式很像科学记数法:尾数和指数这两个都有一个固定的有限范围,具体取决于浮点变量的类型。
在基数为10的情况下,你可能会认为指数范围从10 ^ -10
到10 ^ 10
,尾数在小数点后有4个小数位数,总是归一化的。
考虑到这一点,请查看以下示例添加:
1.2345 * (10 ^ 0) + 1.0237 * (10 ^ 5)
5.2345 * (10 ^ 10) + 6.7891 * (10 ^ 10)
第一个例子是,结果将等于其中一个输入数字,而两者都大于零。第二个例子的结果超出了范围。
然而,计算机使用的浮点表示能够表示无穷大,以及两个:正无穷大和负无穷大。因此,虽然第一个例子可以作为证明,但第二个例子没有,因为加法的结果是正无穷大。
然而,考虑到这一点,您可以制作另一个校对示例:
3.1416 * (10 ^ 0) + (+ infinity)
当然,结果是正无穷大,无论你把它加到什么上。当然,正无穷大不大于正向无穷大,所以再次证明。