为什么在c中加上一个正值的int会变成负值?

为什么在c中加上一个正值的int会变成负值?,c,C,我用c写了代码: #include <stdlib.h> #include <stdio.h> int main() { int num= 2147483646; printf("%d,%d" , num+1, num+2); return 0; } 输出为-2147483647,-2147483648 为什么在我将2添加到变量num时,数字会变成负数?您确定输出不是2147483647,-2147483648吗?我从未遇到过214748

我用c写了代码:

#include <stdlib.h>
#include <stdio.h>

int main()
{

    int num= 2147483646;
    printf("%d,%d" , num+1, num+2);

    return 0;
} 
输出为-2147483647,-2147483648


为什么在我将2添加到变量num时,数字会变成负数?

您确定输出不是2147483647,-2147483648吗?我从未遇到过2147483646是有效整数而2147483647不是有效整数的平台,尽管理论上是可能的

溢出int类型的行为在C中没有定义

一旦达到INT_MAX,这里出现的似乎是INT_MIN的概括,这是这个特定的未定义构造的一种相当常见的表现形式,但不要依赖于此。

输出是2147483647,-2147483648,这是由于INT类型溢出造成的。在4字节和2的补码实现中,该类型的范围为[–2147483648,2147483647]。
您的溢出是未定义的行为。

C设计为尽可能接近计算机的工作方式。这意味着数字或任何数据类型在内存中都是以非常严格的方式表示的。例如,整数由32位表示,可能有2^32个值

根据您的计算机,有符号整数的范围为–2147483647到2147483647,其中无符号整数的范围为0到4294967295请参阅或


计算机以机械方式添加数字,并且不会检查添加是否导致其超出限制。相反,数字只是从最大可能值到最小可能值

你应该阅读关于负数的补码表示法。它解释了一切。发布真实的代码和真实的输出。不要在这里手动重新键入,复制粘贴。我在哪里可以看到它?我对这个网站和程序都是全新的。@Yael123:它深深地埋藏在C语言的规则中,使这个问题合法化。开始读一本书:@Bathsheba这与C无关,一切都与CPU的工作方式有关。与C不同,CPU具有定义良好的2的补码环绕。这就是为什么整数溢出是UB是一个非常愚蠢的语言限制。4字节实现->4字节,2的补码实现你是对的。我对注释进行了编辑以添加该细节。整数由32位表示,可能有2^32个值-这与实际情况相差甚远。32位2的补码范围为–2147483648。此外,这是胡说八道:计算机机械地添加数字,并且不检查添加是否导致其超出限制。世界上几乎每个CPU都有某种状态代码寄存器,其中有一个溢出位,称为“O”或“V”。计算机会检查溢出,然后使用定义良好的环绕。