gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:11:20 25 4
gpt4 key购买 nike

#include <stdio.h>
void show_case(int x) {
printf("x + x + 2 = %d\n", x + x + 2);
printf("!(x + x + 2) = %d\n", !(x + x + 2));
}
int main(){
show_case(-1); // the output is 0 & 1
show_case(0x7fffffff); // the output is 0 & 0;
return 0;
}

各位 friend ,最近我在处理cmu15213中的datalab时遇到了一个很奇怪的问题。

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

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

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

(注意:上面的代码是在我的 Ubuntu 虚拟机上运行的,而在我的 windows Visual Studio 中,结果表明 0x7fffffff 的答案是 0 & 1,这与预期的一样)。 enter image description here

最佳答案

假设 int 是 32 位,0x7fffffffint 可以存储的最大值。然后,当您将该值添加到自身时,它会导致整数溢出,即 undefined behavior .

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

如果您将 x 的类型更改为 unsigned int,您将有明确定义的回绕行为并获得 0 和 1。

关于c++ - Tmax(0x7fffffff) 的一个奇怪问题,为什么 (!x) == x?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62534011/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com