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. 思路和方法 分析: 由于 ...
随机推荐
- SQLServer之创建INSTEAD OF INSERT,UPDATE,DELETE触发器
INSTEAD OF触发器工作原理 INSTEAD OF表示并不执行其所定义的操作INSERT,UPDATE ,DELETE,而仅是执行触发器本身,即当对表进行INSERT.UPDATE 或 DELE ...
- python网络进阶篇
并发编程 进程 操作系统的历史 # 手工操作 —— 穿孔卡片 # 程序员将对应于程序和数据的已穿孔的纸带(或卡片)装入输入机,然后启动输入机把程序和数据输入计算机内存,接着通过控制台开关启动程序针对数 ...
- 【English】20190312
tokens记号 [ˈtoʊkən] delimiter characters分隔符字符 [dɪ'lɪmɪtə] [ˈkærɪktɚs] argument论据主题[ˈɑ:rgjumənt] ...
- 使用idea搭建Scala 项目
主要内容 Intellij IDEA开发环境简介 Intellij IDEA Scala开发环境搭建 Intellij IDEA常见问题及解决方案 Intellij IDEA常用快捷键 1. Inte ...
- vue.js sha256加密
sha256: 1.使用cnpm安装 :cnpm install js-sha256 2.然后在组件中methods定义方法,在调用 let sha256 = require("js-sha ...
- Spring-boot使用eclipse搭建项目(一)
https://blog.csdn.net/qq_37421862/article/details/80484625
- WPF动态模板选择的两种实现
前言 .net开发工作了六年,看了大量的博客,现在想开始自己写博客,这是我的第一篇博客,试试水,就从自己最常使用的WPF开始. 今天我来给大家分享可用户动态选择控件模板的两种实现方式:DataTrig ...
- Linux内存管理 (8)malloc
专题:Linux内存管理专题 关键词:malloc.brk.VMA.VM_LOCK.normal page.special page. 每章问答: malloc()函数是C函数库封装的一个核心函数,对 ...
- Cesium如何通过addImageryProvider方法加载SkylineGlobe Server发布的WMS服务
某某某单位用SkylineGlobeServer7版本发布了好些服务,然后让我们在Cesium里都加载进来展示. 其实只要符合OGC标准的,加进来还是很容易的. 示例代码如下: function te ...
- vue style标签中使用less
只需要下载相应的包即可:(前提是使用vue-cli搭建的项目) 1.安装less依赖,npm install less less-loader --save 2.即可在相应的vue文件中使用less操 ...