Tmax(0x7fffffff 的一个奇怪问题,为什么 (!x) == x?

A weird question for Tmax(0x7fffffff), why (!x) == x?

本文关键字:为什么 问题 0x7fffffff Tmax 一个      更新时间:2023-10-16
#include <stdio.h>
void show_case(int x) {
printf("x + x + 2 = %dn", x + x + 2);
printf("!(x + x + 2) = %dn", !(x + x + 2));
}
int main(){
show_case(-1);  // the output is 0 & 1
show_case(0x7fffffff); // the output is 0 & 0;
return 0;
}

嗨,朋友们,最近我在处理 cmu 15213 中的数据实验室时遇到了一个非常奇怪的问题。

我将问题简化为上面的代码。

如我们所见,我实现了一个 show_case 函数,它可以显示 (x + x + 2( 和 !(x + x + 2(; 当参数为 -1 时,结果如我们预期的那样,x+x+2 = 0 和 !(x+x+2( = 1。

但是当我转向0x7fffffff时,我发现 x+x+2 = 0 和 !(x + x + 2( = 0,这对我来说真的很奇怪。

(注意:上面的代码是在我的 Ubuntu 虚拟机上运行的,而在我的 Windows Visual Studio 中,事实证明 0x7fffffff 的 ans 是 0 和 1,这是预期的(。 在此处输入图像描述

假设int为 32 位,则0x7fffffffint可以存储的最大值。 然后,当您将该值添加到自身时,它会导致整数溢出,这是未定义的行为。

当我运行此代码时,对于第二种情况,我得到 0 和 1。 这是未定义行为如何表现的一个例子:它在两个不同的系统上的工作方式不同。

如果将x类型更改为unsigned int,则将具有明确定义的环绕行为,并得到 0 和 1。

因为你溢出了整数。整数溢出是一种未定义的行为。

如果您将参数更改为 unsigned (这将环绕( - 它将按照您想要的方式运行

https://godbolt.org/z/Ydp55C