Tmax(0x7fffffff 的一个奇怪问题,为什么 (!x) == x?
A weird question for Tmax(0x7fffffff), why (!x) == x?
#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 位,则0x7fffffff
是int
可以存储的最大值。 然后,当您将该值添加到自身时,它会导致整数溢出,这是未定义的行为。
当我运行此代码时,对于第二种情况,我得到 0 和 1。 这是未定义行为如何表现的一个例子:它在两个不同的系统上的工作方式不同。
如果将x
类型更改为unsigned int
,则将具有明确定义的环绕行为,并得到 0 和 1。
因为你溢出了整数。整数溢出是一种未定义的行为。
如果您将参数更改为 unsigned (这将环绕( - 它将按照您想要的方式运行
https://godbolt.org/z/Ydp55C
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么瓦尔格林德在不释放恶意内存后没有报告任何问题?
- N-queen问题:无法弄清楚为什么我的解决方案不起作用
- Tmax(0x7fffffff 的一个奇怪问题,为什么 (!x) == x?
- 为什么我在代码厨师的 CMPRSS 问题中得到 WA(错误答案)?
- 为什么循环会导致指针出现问题?
- 当问题在性质上完全不同时,为什么要使用 C2259?
- 为什么在分配给成员变量之前获取unique_ptr的返回是一个问题?
- 为什么在这个C++问题中使用const_iterator而不仅仅是迭代器?
- 什么是非营利组织???我的问题是我不明白为什么有人会使用它
- 为什么我的程序在打开网络设备时遇到问题
- 为什么我在虚幻引擎中的多态性和接口方面遇到问题?
- 这个模板为什么有问题?如何正确编译
- 为什么我的类电影在创建电影实例时遇到问题?
- 为什么使用 2 个嵌套循环 O(n^2) 复杂度来解决二和问题,当只改变循环计数器逻辑时运行得更快?
- 长有什么问题?为什么自动减去 1?
- 为什么主机不显示?(C++和代码处理器问题)
- 为什么我在这个函数中的while循环出现问题
- 在钻石问题的求解中,为什么要虚拟地继承两次grand-parent类
- 为什么在某些情况下,我在这个问题上会得到TLE?