算术规则在C中适用于加法吗?

算术规则在C中适用于加法吗?,c,computer-science,C,Computer Science,我是C语言的新手,我很难理解这些材料。我真的需要帮助!请找个人帮忙 在算术中,任意两个正整数之和大于: (n+m) > n for n, m > 0 (n+m) > m for n, m > 0 C有一个加法运算符+。这个算术规则在C语言中适用吗 我知道这是假的。但请有人解释一下为什么,我能理解吗?请提供反例 提前谢谢。它不成立,因为C的整数不是(数学中)实整数的“抽象”无限大整数 在C语言中,整数是离散的和数字的,并且使用固定数量的位来实现。这会导致范围有限,并且当您

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

在算术中,任意两个正整数之和大于:

(n+m) > n for n, m > 0
(n+m) > m for n, m > 0
C有一个加法运算符+。这个算术规则在C语言中适用吗

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


提前谢谢。

它不成立,因为C的整数不是(数学中)实整数的“抽象”无限大整数

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

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

由于不同的原因,整型和浮点运算都为false

  • 整数容易受到影响
  • 将非常小的浮点数
    m
    添加到非常大的数
    n
    将返回
    n
    。读一读

我的简短搜索并没有给出描述这些问题的好答案,所以我宁愿尝试在这里为初学者提供好答案

答案当然是错误的,但为什么呢

整数

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

仅此一点就证明了
a+b>a
a+b>b
不可能总是正确的,因为它可以设置为
a
b
都小于计算机在其存储器中可以表示的最大数字,但
a+b
大于这个数字

这里到底发生了什么,要看情况而定。有些人提到了概括,但事实并非如此。首先,C语言将整数溢出定义为一种未定义的行为,即如果代码碰巧踩到它,那么可能会发生任何事情,包括火灾和烟雾(当然,在现实中不会发生这种情况,但严格解释标准时,它可能会发生,也可能违反时空连续体)

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

浮点

这里的情况也和整数一样:理解为什么数学在这里没有完全应用的关键是计算机的存储空间有限

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

在基数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)

当然,结果是正无穷大,不管你把它加到什么上面。当然,正无穷大并不比正无穷大,所以再次证明了。

+1回答得好,但我会用范围这个词来代替上面的精度。浮点数的精度有限;整数是精确范围内的整数。“实整数”?双关语:“离散和数字?”你在说什么?有没有一种编程语言,其中整数是连续的和模拟的?WECSSKABFPA是一种吓人的读物,对与问题直接相关的部分的操作有什么建议吗?可以补充一点,编译器可能会假设这一点适用于有符号整数,也就是说,程序员有责任确保这一点适用(链接的维基百科文章中似乎没有提到,溢出一词似乎是指环绕(如在汇编或带有无符号整数的C中),而不是溢出在C标准中的含义).这是唯一一个不能通过简单的尝试来理解的部分。@OliverCharlesworth:也许这是内涵:如果这很吓人,你不需要浮点:P