您的位置:首页 > 其它

关于int的取值范围以及溢出的问题

2020-02-12 08:14 82 查看

int取值范围问题

看了好多大佬的评论以及回复,稍微懂了这么一点点,总结一下
首先谈一下int的取值范围问题
众所周知一个字节也就是1byte 取值范围=-27 ~ 27-1也就是-128~127,再看一下int类型,一个int类型占几个字节首先要看你是什么操作系统
16位的操作系统一个int占2个字节
32位和64位的操作系统一个int占4个字节
反正现在基本都用32位和64位,我就说一下这个吧
一般它们都长这样

0000 0000 0000 0000 0000 0000 0000 0001

至于为什么是-231~ 231-1百度搜去,很多文章
最左边的一位是符号位0为正,1为负,所以会有一个+0和一个-0
由于-0的原码没有补码
由此可得int取值范围就是-231~ 231-1

int溢出问题

不要觉得这样就完了,不可能,上面放的是原码,咱们计算机储存都是靠补码储存的
简单介绍一下以下这三个东西
原码,反码,补码

正数 负数
原码 计算机中对数字的二进制定点表示方法 计算机中对数字的二进制定点表示方法
反码 等于原码 除符号位外按位取反
补码 等于原码 反码+1

举个例子

正数 1 负数1
原码 0000 0000 0000 0000 0000 0000 0000 0001 1000 0000 0000 0000 0000 0000 0000 0001
反码 0000 0000 0000 0000 0000 0000 0000 0001 1111 1111 1111 1111 1111 1111 1111 1110
补码 0000 0000 0000 0000 0000 0000 0000 0001 1111 1111 1111 1111 1111 1111 1111 1111

ok,进入正题说我们的int溢出问题,我们先举个小例子吧,我们取int的最大值2147483647也就是231-1

int i=2147483647;
System.out.println("i+1的值为"+(i+1));

运行结果

i+1的值为-2147483648

为什么会这样呢,首先我们知道int 的正数最大值就是(补码)

0111 1111 1111 1111 1111 1111 1111 1111

现在+1,也就是

0111 1111 1111 1111 1111 1111 1111 1111+0000 0000 0000 0000 0000 0000 0000 0001
结果就是 1000 0000 0000 0000 0000 0000 0000 0000 也就是就是-0的补码

将-0转回原码,发现溢出了,所以,-0没有原码,然后就把-0规定为int的最小值,也就是-2^31
不信可以再+1,也就是

1000 0000 0000 0000 0000 0000 0000 0000 +0000 0000 0000 0000 0000 0000 0000 0001
结果就是1000 0000 0000 0000 0000 0000 0000 0001
转成原码就是1111 1111 1111 1111 1111 1111 1111 1111也就是-2^31-1,不信用计算器算,哈哈

得出结论

ok谢谢各位观看到这,祝你们永不秃头,不秃头,秃头;

  • 点赞 1
  • 收藏
  • 分享
  • 文章举报
头发很多的阿哲啊 发布了3 篇原创文章 · 获赞 5 · 访问量 53 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: