int main()
{
    int a = 2147483647; 
    int c = a + a + 2;
    printf("2a + 2 = %d, !(2a + 2) = %d, !c = %d\n", (2 * a + 2), !(a + a + 2), !c);
}

我运行上面的代码时得到了这个

2a+2=0!(2a+2)=0!c=1

a是Tmax,二进制形式为0111...所以a+a+2被假定为0000...0

推荐答案

假设int是32位,您正在执行的操作会导致有符号整数溢出.这样做会触发undefined behavior.它有not个必要的环绕.

事实上,在C standard的第3.4.3p3节中,这一特定情况作为未定义行为的示例给出,其中定义了术语undefined behavior:

未定义行为的一个示例是整数溢出行为

您遇到了一种未定义的行为可以表现出来的奇怪方式,即看似相同的操作表现不同.未定义的行为意味着无法保证程序将做什么.

C++相关问答推荐

为什么静态说明符为内联函数生成外部定义?

C指针算法在函数参数中的应用

为什么复合文字(C99)的返回会生成更多的汇编代码?

为什么在Linux(特别是Ubuntu 20.04LTS)上,POSIX共享内存对象在重启后仍然存在,然后突然变成了根用户?

为什么可以在typedef之前使用typedef d struct 体?

Can函数指针指向C++中具有不同参数连续性的函数

为什么函数是按照定义的顺序执行的,而不是按照从avr-c中的int main()调用的顺序执行的?

C I/O:在Windows控制台上处理键盘输入

在进程之间重定向输出和输入流的问题

如何将C中的两个字符串与从文件接收的字符串中的字符数进行比较

链表删除 node 错误

从C中的函数返回静态字符串是不是一种糟糕的做法?

用C++高效解析HTTP请求的方法

向左移位3如何得到以字节为单位的位数?

赋值两侧的后置增量,字符指针

在文件描述符上设置FD_CLOEXEC与将其传递给POSIX_SPOWN_FILE_ACTIONS_ADCLOSE有区别吗?

意外的C并集结果

在C中使用字符串时是否不需要内存分配?

cs50拼写器分配中的无限循环

创建 makefile 来编译位于不同目录中的多个源文件