最近在练一些算法题目的时候恰巧碰到了几道关于int范围与溢出相关的问题,于是就整理一下。

1、原码、补码

在计算机中数值都是用补码表示和存储的(正数补码与原码一致,负数补码是原码符号位不变,其余位取反,然后+1即反码+1)。

可以通过将这个数每一位和1做&运算得到具体的二进制表示,代码如下。代码部分参考https://blog.csdn.net/youyou362/article/details/72667951

 /**
* 将n的每一位与1做&运算 得到具体的二进制表示
* @param n
* @return
*/
public static void converseToBinary(int n) {
int value = 1;
int[] arr = new int[32];
int i = 31;
while (value != 0) {
if ((value & n) != 0) {
arr[i] = 1;
} else {
arr[i] = 0;
}
i--;
value = value << 1; //左移右边补0,当移完32为value为0.
}
for (int index = 0;index < 32;index++){
System.out.print(arr[index]);
if ((index+1)%4 == 0){
System.out.print(" ");
}
}
}

例如-3,程序运行结果为 1111 1111 1111 1111 1111 1111 1111 1101 ,正是-3的补码。由此得知在计算机中数值都是用补码表示和存储的。

2、int的取值范围

java中int四字节,一个字节8bit所以 int 32bit 即高16位和低16位,共32位,最高位符号位。

在Integer类中,有两个常量 MIN_VALUE和MAX_VALUE是16进制的数。

 /**
* A constant holding the minimum value an {@code int} can
* have, -2<sup>31</sup>.
*/
@Native public static final int MIN_VALUE = 0x80000000; /**
* A constant holding the maximum value an {@code int} can
* have, 2<sup>31</sup>-1.
*/
@Native public static final int MAX_VALUE = 0x7fffffff;

转化成二进制分别是MIN_VALUE = 1000 0000 0000 0000 0000 0000 0000 0000;

MAX_VALUE =  0111 1111 1111 1111 1111 1111 1111 1111;

网上看了好多文档,关于最大值和最小值为什么是这两个写的挺模棱两可的,一开始我猜想正数最大值的时候是因为一共32位,第一位符号位0,剩下都应该是1才是最大,得到正好是0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111,即2^31 - 1,但已这种方式推算负数最大值时进行不下去,于是用数学归纳法进行总结:

正数部分:1的补码为 0000 0000 0000 0000 0000 0000 0000 0001;

2的补码为0000 0000 ............................................. 0010 ;

3的补码为 0000 0000 ............................................. 0011;

     由此推出正数最大值的补码为 0111 1111 1111 1111 .......................1111,原码=补码,为2^31-1;

负数部分:-1的补码为 1111 1111 1111 1111 1111 1111 1111 1111

-2的补码为 1111 1111 1111 1111 1111 1111 1111 1110

-3的补码为 1111 1111 1111 1111 1111 1111 1111 1101

-4的补码为 1111 1111 1111 1111 1111 1111 1111 1100

由此推出负数最小值的补码为 1000 0000 0000 0000 0000 0000 0000 0000 0000,求负数最小值补码的原码为-2^31

所以int的范围为-2^31 ~ 2^31-1

3、int的溢出问题,参考自https://www.jianshu.com/p/ffc97c4d2306

溢出是针对有符号数的。

int最大值为 2^31 - 1 补码为 0111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 加1为 1000 0000 0000 ................0000有溢出,为-2^31

int最小值   -2^31 补码为 1000 0000 0000 0000 0000 0000 0000 0000 0000  ,-2^31 - 1为加-1的补码1111 1111 1111 1111 1111 1111 1111 1111

溢出为 1 0111 1111 1111 1111 11111 1111 1111 1111为 2^31 - 1。

本人只是个小白,以上只是个人拙见,如果有问题还请大家指出,有更好的想法欢迎大家留言,一起进步,谢谢!

关于int的范围以及溢出问题的更多相关文章

  1. 将 expression 转换为数据类型 int 时发生算术溢出

    将 expression 转换为数据类型 int 时发生算术溢出错误 2种快速处理方法 1.CONVERT(bigint, 字段名): 2.Cast(字段名 as decimal(18,2)): 这个 ...

  2. 将 IDENTITY 转换为数据类型 int 时出现算术溢出错误。

    IDENTITY标识列为int类型,取值范围为-2^32到2^31-1.当增长值超过这个最大值时,我在SQL Server 2008 R2 x64上试验的结果是: 将 IDENTITY 转换为数据类型 ...

  3. sql servel 报错:将 expression 转换为数据类型 int 时出现算术溢出错误。

    执行sql语句:SELECT   AVG( DATEDIFF(s,s.CreatedDate,s.SendDate)  ) AS submitTime FROM dbo.SmsSend AS s    ...

  4. 将expression转化为数据类型int时发生算术溢出错误

    在SQL Server 中,某列的数据都在int范围之内,但是使用sum聚集函数求该列和的时候,出现“将expression转化为数据类型int时发生算术溢出错误”. 问题在于定义的数据类型: 首先, ...

  5. 两个int的和判断溢出

    long a,b; cin>>a>>b; long i; i = a+b; if((i^a)<0 && (i^b)<0) cout<<& ...

  6. 【转载】小心 int 乘法溢出!

    C/C++ 语言里, 绝大部分平台上 int 类型是 32 位的, 无论你的操作系统是否是 64 位的. 而一些常用的函数, 如 malloc(), 它接受的参数是 size_t 类型: void * ...

  7. C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别

    转自:http://www.cnblogs.com/leolis/p/3968943.html 在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为 整型(int)来讲, ...

  8. C#中(int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别 <转>

    作者:Statmoon 出处:http://leolis.cnblogs.com/   在编程过程中,数据转换是经常要用到的,C#中数据转换的方法很多,拿将目标对象转换为整型(int)来讲,有四种方法 ...

  9. (int)、int.Parse()、int.TryParse()和Convert.ToInt32()的区别

    C#中(int).int.Parse().int.TryParse()和Convert.ToInt32()的区别   原文链接:http://www.cnblogs.com/leolis/p/3968 ...

随机推荐

  1. 基于C#的机器学习--深层信念网络

    我们都听说过深度学习,但是有多少人知道深度信念网络是什么?让我们从本章开始回答这个问题.深度信念网络是一种非常先进的机器学习形式,其意义正在迅速演变.作为一名机器学习开发人员,对这个概念有一定的了解是 ...

  2. 多线程总结-同步之synchronized关键字

    目录 1.为什么要使用synchronized? 2.synchronized锁什么,加锁的目的是什么? 3.代码示例 3.1锁this和临界资源对象 3.2锁class类对象 3.3 什么时候锁临界 ...

  3. STM32F072从零配置工程-串口USART配置

    也是使用HAL库进行配置,通过STMCube生成代码,可以通过这个简单的配置过程看到STMCube生成代码的一种规范: 从main函数入手观察其外设配置结构: 首先是HAL_Init()进行所有外设的 ...

  4. dbo是默认用户也是架构

    dbo是默认用户也是架构 dbo作为架构是为了更好的与2000兼容, 在2000中DataBaseName.dbo.TableName解释为:数据库名.用户名.表名, 在2005中DataBaseNa ...

  5. python 中_init_函数以及参数self

    1)class类包含: 类的属性:类中所涉及的变量 类的方法:类中函数 2)_init_函数(方法) 1.首先说一下,带有两个下划线开头的函数是声明该属性为私有,不能在类地外部被使用或直接访问. 2. ...

  6. Shiro在Web环境下集成Spring的大致工作流程

    1,Shiro提供了对Web环境的支持,其通过一个 ShiroFilter 入口来拦截需要安全控制的URL,然后进行相应的控制.      ①配置的 ShiroFilter 实现类为:org.spri ...

  7. Adaboost原理推导

    Adaptive Boosting是一种迭代算法.每轮迭代中会在训练集上产生一个新的学习器,然后使用该学习器对所有样本进行预测,以评估每个样本的重要性(Informative).换句话来讲就是,算法会 ...

  8. c语言进阶12-线性表之顺序表

    一.  线性表的定义 为什么要学习线性表呢? 因为我们日常生活中存在种数据关系,计算机程序是为了解决日常生活的数据关系,因此我们要学习线性表. 线性表是什么呢? 线性表是由n个元素组成的有限序列. 需 ...

  9. C#3.0新增功能08 Lambda 表达式

    连载目录    [已更新最新开发文章,点击查看详细] Lambda 表达式是作为对象处理的代码块(表达式或语句块). 它可作为参数传递给方法,也可通过方法调用返回. Lambda 表达式广泛用于: 将 ...

  10. 用tcp协议实现一个并发的socketserver 进行密文登录

    先在客户端进行摘要,客户端把用户名作为盐. 然后在服务端进行二次摘要,用固定的盐(不能让别人知道你的盐是什么),然后存到文件中,密文存储.或者和文件中的密文对比. 这样即使在网络上用户信息被截获,和存 ...