C++-int类型整数超出范围后的处理
最近做了一道题目:
Given a 32-bit signed integer, reverse digits of an integer.
Example 1:
Input: 123
Output: 321
Example 2:
Input: -123
Output: -321
Example 3:
Input: 120
Output: 21
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
来源:https://leetcode.com/problems/reverse-integer/
先贴上自己丑陋的代码:
class Solution {
public:
int reverse(int x) {
bool isNegative=false;
if(x==||x<-*pow(,)+||x>pow(,)-)
return ;
if(x<){
isNegative=true;
x=-*x;
}
while(x%==)
x=x/;
int ans=,temp;
temp=x-(x/)*;
while(x>=&&ans<pow(,)/){
ans=ans*;
ans+=temp;
x=x/;
temp=x-(x/)*;
}
if(x>=)
return ;
if(isNegative)
ans=ans*(-);
return ans;
}
};
(单从速度角度来看,好像还可以?).

但是看到了讨论区一个意大利大佬的代码,确实是short and element:
public int reverse(int x) {
int prevRev = , rev= ;
while( x != ){
rev= rev* + x % ;
if((rev - x % ) / != prevRev){
return ;
}
prevRev = rev;
x= x/;
}
return rev;
}
不像我傻傻地用pow判断溢出,这段代码的判定语句很特别:
if((rev - x % 10) / 10 != prevRev){
return 0;
我放到vs里测试了一下,打印了结果出来。
测试代码:
cout << rev << endl;
rev = rev * + x % ;
cout << "afterchange:" << rev << endl;
结果:

关键是最后一行,应该是9646324351的结果变成了1056389759.这应该就是Int溢出的结果。
通过查找网络资料,看到有一个答案说的是对的(https://zhidao.baidu.com/question/1899917410883143460.html?qbl=relate_question_0&word=C%2B%2B%20Int%D4%CB%CB%E3%B3%AC%B3%F6%B7%B6%CE%A7)
C语言int占4个字节,一共32位,范围是-2147483648 ~ 2147483647。
如果超出这个范围,就会加上或减去4294967296,使得值还落在这个范围内。
比如定义int变量a的值为2147483647,再加1就是2147483648,超出范围,因此需要减掉4294967296,最后打印的值就是-2147483648
实际上,1056389759就是9646324351-2*4294967296.也就是减去了两倍的“模长”。
不像一开始就输入一个超出Int范围的整数时的情况,编译器不会发现超出范围、不会报错(因为这更像一个逻辑错误,是运行中产生的),只会在运行的过程中通过“减模长”的形式使其在范围内。
所以,之后判断Int超出时,可以使用一个整数来配合检查,其的作用是保存变换之前的整数,以此和变换后的整数通过变换公式来检查变换是否正确,如果变换发生了异常,则说明超出了范围。
当然,也可以通过一个Long来保存正确结果,通过和这个Long的数值比较来确定有没有出现问题。但是这样的话好像就没有太大意义了(笑~)
C++-int类型整数超出范围后的处理的更多相关文章
- 编程计算int类型整数的最大值和最小值
方法一:将一个int类型整数不断加1,加到最大值,再加1,就变成负值(最小值) 最大值就是除最高位外,其余位都为1,-1即是所有位全部是1,右移1位后最高位变0 最小值即是最高位为1,其余位为0, ...
- 通过移位与或非运算获取整形最大值,最小值,以及获取输入的int类型整数的二进制表示
以上是最终效果 实现类: package com.corejava.chap02; public class IntBin { private int value; public IntBin(int ...
- double类型转换为int类型四舍五入工具类
package com.qiyuan.util; import java.math.BigDecimal; import java.text.DecimalFormat; public class G ...
- mysqlint类型的长度值mysql在建表的时候int类型后的长度代表什么
详解mysql int类型的长度值 mysql在建表的时候int类型后的长度代表什么 是该列允许存储值的最大宽度吗 为什么我设置成int(1), 也一样能存10,100,1000呢. 当时我虽然知道i ...
- java中整数的默认为int类型的一些问题
thingking in java 读书感悟 作者 :淮左白衣 写于2018年4月8日17:51:44 关于整数的默认类型,以及会产生的一些小问题 涉及基本数据类型的重载 关于整数的默认类型,以及会产 ...
- int类型的整数转换成汉字
int类型的整数转换成汉字 一.源代码:IntegerNumberToChinese.java package cn.com.zfc.example; import java.util.Scanner ...
- 写一个函数,输入int型,返回整数逆序后的字符串
刚刚看到一个面试题:写一个函数,输入int型,返回整数逆序后的字符串.如:输入123,返回"321". 要求必须用递归,不能用全局变量,输入必须是一个參数.必须返回字符串.&quo ...
- 两个int类型的数据相加,有可能会出现超出int的表示范围。
两个int类型的数据相加,有可能会出现超出int的表示范围. /* 移位运算符: <<(左移) 规律:一个操作数进行左移运算的时候,结果就是等于操作数乘以2的n次方,n就是左移 的位数. ...
- 剑指offer12:求解double类型的浮点数base和int类型的整数exponent的次方。 保证base和exponent不同时为0
1. 题目描述 给定一个double类型的浮点数base和int类型的整数exponent.求base的exponent次方.保证base和exponent不同时为0. 2. 思路和方法 分析: 由于 ...
随机推荐
- gitlab-server环境搭建
1.安装GitLab的需求 操作系统 受支持的Unix衍生版 Ubuntu Debian CentOS Red Hat Enterprise Linux (使用CentOS的包和命令) Scienti ...
- python网络进阶篇
并发编程 进程 操作系统的历史 # 手工操作 —— 穿孔卡片 # 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数 ...
- 【Python使用】使用pip安装卸载Python包(含离线安装Python包)未完成???
pip 是 Python 包管理工具,该工具提供了对Python包的查找.下载.安装.卸载的功能.Python 2.7.9 + 或 Python 3.4+ 以上版本都自带 pip 工具. pip使用( ...
- Windows Service 学习系列(一):建立简单的Windows service
参考:https://www.cnblogs.com/cncc/p/7170951.html 一.开发环境 操作系统:Windows 7 X64 开发环境:VS2017 编程语言:C# .NET版本: ...
- day 16 包的导入
包的认识 '''包通过文件夹来管理一系列功能相近的模块包:一系列模块的集合体重点:包中一定有一个专门用来管理包中所有模块的文件包名:存放一系列模块的文件夹名字包名(包对象)存放的是管理模块的那个文件 ...
- 20145236《网络对抗》进阶实验——64位Ubuntu 17.10.1 ROP攻击
20145236<网络对抗>进阶实验--64位Ubuntu 17.10.1 ROP攻击 基础知识 ROP攻击 ROP全称为Retrun-oriented Programmming(面向返回 ...
- SpringBoot中使用Servlet,Filter,Listener
项目最近在替换之前陈旧的框架,改用SpringBoot进行重构,初接触,暂时还没有用到Servlet,Filter,Listener的地方,但在之前回顾Servlet的生命周期时,https://ww ...
- 常用vim命令
一.Vim编辑器的常用命令 在Linux下毫无疑问vim编辑器是非常好用的 因为平时有用到,有些东西不常用就会忘记,特记录下自己一些常用的 1.1.2 命令模式转换为编辑模式 i: 在当前光标所在 ...
- django的中英文支持及切换
版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 1.http://mlocati.github.io/articles/gettext-iconv-w ...
- BEX5下实现鼠标滚动滚动条
使用前提: 页面内容过多,默认的滚动条太难看,在不引入滚动条插件情况下让界面不使用滚动条,又能通过鼠标滚动 实现步骤: 1 在会出现滚动条的组件上设置隐藏滚动条 overflow:hidden; 2 ...