对int类型最小值INT_MIN取负值结果不变

在32位系统中,int类型的最大值是0x7fffffff(即除了最高的1Bit其他31位都为1),而最小值是0x80000000(除了最高1bit,其他31位都为0)。

显然,对于最小值求负数是不存在的,为什么会使最小值本身呢?

这是由于在计算负运算时,是针对int类型数据进行“取反加一”操作。这样对于最小值而言,“取反加一”还是本身保持不变。

另外,针对整数的计算,都是从位的角度的进行的。比如,int类型数据的最大值(0x7fffffff )加1,会得到int类型的最小值(0x80000000);而对于unsigned int类型的0x7fffffff 加1 ,也会得到0x80000000,这在位的角度来看都是一致的。

#include <stdio.h>

int main()
{
	int a = 0x80000000;	
	int b = 0x7fffffff;
	printf("INT_MIN and its' negative is :\n %d, %d\n\n", a, -a);
	
	printf("INT_MAX and INT_MAX+1 is :\n %d, %d\n\n", b, b+1);
	
	printf("unsigned(INT_MAX)  and unsigned(INT_MAX+1) is :\n %u, %u\n\n", b, b+1);
	
	return 0;
}

/*******输出如下****************/

Process started >>>

INT_MIN and its' negative is :
 -2147483648, -2147483648

INT_MAX and INT_MAX+1 is :
 2147483647, -2147483648

unsigned(INT_MAX)  and unsigned(INT_MAX+1) is :
 2147483647, 2147483648

<<< Process finished. (Exit code 0)

posted @   gexin1023  阅读(2863)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
· 零经验选手,Compose 一天开发一款小游戏!
点击右上角即可分享
微信分享提示