前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >为什么最大值加一等于最小值

为什么最大值加一等于最小值

作者头像
卡尔曼和玻尔兹曼谁曼
发布2019-01-23 09:53:02
1.5K0
发布2019-01-23 09:53:02
举报

在程序中有时候不小心将最大数值加1,我们会得到一个负数,这个负数就是这种数据类型的最小值。

下面看一个示例:

代码语言:javascript
复制
public class Number {
	public static void main(String[] args) {
		System.out.println("最大的整数:" + Integer.MAX_VALUE);
		System.out.println("最大的整数(二进制):" + Integer.toBinaryString(Integer.MAX_VALUE));
		System.out.println("最小的整数:" + Integer.MIN_VALUE);
		System.out.println("最小的整数(二进制):" + Integer.toBinaryString(Integer.MIN_VALUE));
		System.out.println();
		long num1 = Integer.MAX_VALUE + 1;
		System.out.println("最大的数" + Integer.MAX_VALUE + "加一等于" + num1);
		long num2 = 2147483647L + 1;
		System.out.println("在运算过程中强制类型转换");
		System.out.println("最大的数" + Integer.MAX_VALUE + "加一等于" + num2);
	}
}

运行结果:

代码语言:javascript
复制
最大的整数:2147483647
最大的整数(二进制):1111111111111111111111111111111
最小的整数:-2147483648
最小的整数(二进制):10000000000000000000000000000000

最大的数2147483647加一等于-2147483648
在运算过程中强制类型转换
最大的数2147483647加一等于2147483648

从结果可以看出:最大的整数加一确实变成了最小的整数,从它们的二进制形式更可以明显的看出。计算机内部进行计算的时候是以二进制的补码形式进行加法运算的。很显然,最大的数01111111111111111111111111111111+1=10000000000000000000000000000000,这里的10000000000000000000000000000000是-2147483648的补码形式。

如果在运算过程中我们强者将数据类型转换成存储容量更大的数据类型,则不会出现这一变成负数这样的结果。2147483647L + 1是long型的2147483647+1这样就不会溢出变成负数。

此外,还需要注意的是在Java和C#中int是32位,long是64位,我们这样转换没有问题。但是在C++语言中short、int和long的位数和操作系统有关。我们只能说short<=int<=long,当然两个等号不会同时成立。所以有时候我们会看到long long这样的写法,long long是比long类型容量更大的整形。在VC++中long long也写作_int64。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2015年02月04日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档