关于int的取值范围以及溢出的问题 您所在的位置:网站首页 32位int类型的范围 关于int的取值范围以及溢出的问题

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

2023-08-18 22:24| 来源: 网络整理| 查看: 265

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谢谢各位观看到这,祝你们永不秃头,不秃头,秃头;


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有