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

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 00011000 0000 0000 0000 0000 0000 0000 0001
反码0000 0000 0000 0000 0000 0000 0000 00011111 1111 1111 1111 1111 1111 1111 1110
补码0000 0000 0000 0000 0000 0000 0000 00011111 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谢谢各位观看到这,祝你们永不秃头,不秃头,秃头;

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值