整数溢出体现的哲学道理
一、背景
今天一个小伙伴发了一个demo,问结果是啥,为什么?
public class WhileTest {public static void main(String[] args) {int i = 0;while (true){i++;if(i == 10){System.out.println(i);}}}
}
有些回答10,有些回答居然是9.....
小伙伴们运行就会发现,打印了好多次10。
可能很多小伙伴觉得so easy,溢出了呗,负数了呗。
请问哪个负数?最大值+1是几?
能不能清晰地从二进制角度去讲解?
面试官说:if 能 then 能否讲讲体现出啥哲理??
are you kidding me ?咋还扯到哲学了!?
这个面试官惹不起,咱不面了,还是主动回家等消息吧......
二、分析
首先这是单线程(单线程都是顺序执行的),if条件是等于10为真,怎么可能打印出来的是9????
另外的话我们看,初始化是0,然后while循环是恒真的,那么i++会一直执行,当加到10的时候 下面肯定会打印出来的。
那么然后呢??然后一直增加对吧?
那么如果一直增加到整数最大值怎么办??会发生什么???
我们先看下整数最大值如果再+1会怎样?
int i = Integer.MAX_VALUE;System.out.println(i+1);
System.out.println(Integer.MIN_VALUE);
发现结果是:-2147483648,是负数!!而且是整数的最小值!
因此再一直加1是不是又到了0 然后到10,然后又打印一次对吧,然后继续循环.....
小伙伴们运行就会发现,打印了好多次10。
那么为什么会酱紫??
int 类型在 Java 中是“有符号”的,所谓“有符号”就是有正负。
大家知道计算机中用二进制表示所有的信息,java中整数是4个字节(一个字节8位)即32位,其中首位是符号位,如果是1表示负数,0则表示整数。
但是如果正数过大了,例如 2^31,计算机不得不把首位变成 1,并且很快就忘了这是溢出情况,把它按照正常的方式输出了,于是就成了负的。
其实也不能怪它,它没有办法自动处理超过溢出的情况,因为 32 位是固定的,它不能因为溢出而临时扩展到 33 位之类的。
这和钟表很相似,
十二小时表示法的时钟,转到了中午12点,然后会怎样???
盘面就那么大总不能给你变出个13吧?虽然我们知道是下午1点,但是其盘面的效果和凌晨1点没区别。
2^31 - 1 = 0111 1111 1111 1111 1111 1111 1111 1111 = 2147483647
2^31 = 2^31 - 1 + 1 = 1000 0000 0000 0000 0000 0000 0000 0000 = -2147483648
溢出变成 0 的话道理也一样。你想如果一个数大到最后 32 位都是 0 了,那计算机只能把它认作 0。
这种情况有很多,例如 2^32 就是一共 33 位,首位 1,后面 32 位都是 0。
我们从二进制的角度可以清晰的认识到,2^31 - 1 = 0111 1111 1111 1111 1111 1111 1111 1111 = 2147483647 加一后(二进制逢二进一)确实是整数能表示的最小值 2^31 = 2^31 - 1 + 1 = 1000 0000 0000 0000 0000 0000 0000 0000 = -2147483648。
另外为啥整数的最大值是2的31次方-1,而不是32次方??
因为首位是符号位,因此数据位只有31位。31位全为1才是最大值
那么值为 2^30+2^29+...+2^0 = 2^31-1次。
为啥最小值是2^31?
最小值肯定为负数,则首位为1,那么剩下31位最小的话必定都为0。因此值为1*2^31+0+...+0=2^31。
三、教训
1996年6月4日,阿丽亚娜5型运载火箭(Ariane 5)在法国库鲁的欧洲运载火箭发射场发射,37秒后火箭解体并爆炸。火箭的开发费用大约70亿美元,火箭本体及运载的设备价值约5亿美元。两周后的调查报告指出,爆炸原因由于火箭某段控制程序直接移植自阿丽亚娜4型火箭,其中一个需要接收64位数据的变量为了节省存储空间而使用了16位字节,从而在控制过程中产生了整数溢出,导致导航系统对火箭控制失效,程序进入异常处理模块,引爆自毁。
这都是不细心和基础不扎实惹的祸!
知道为什么面试中爱问各种数据类型的范围了吧?
开发中要选取最合适的数据类型,考虑极端情况,比如整数溢出的问题,订单Id等增长较快的整型要设置为长整型。
四、延伸
4.1 “物极必反”、“否极泰来”
另外让我想到了两个词语“物极必反”、“否极泰来”(虽然不完全一致,思想是一致的)
物极必反
【解释】:极:顶点;反:向反面转化。事物发展到极点,会向相反方向转化。
【出处】:《吕氏春秋·博志》:“全则必缺,极则必反。”《鹖冠子·环流》:“物极则反,命曰环流。”
否极泰来
【解释】否、泰:《周易》中的两个卦名。否:卦不顺利;泰:卦顺利;极:尽头。逆境达到极点,就会向顺境转化。指坏运到了头好运就来了。
【出处】《周易·否》:“否之匪人,不利君子贞,大往小来。”《周易·泰》:“泰,小往大来,吉亨。”《吴越春秋·勾践入臣外传》:“时过于期,否终则泰。
我们整数不断增加到最大值,然后“物极必反”就转化为了负数。我们整数的最小值即“否极”然后不断增加即“泰来”。
可见中国古人的智慧。
4.2 矛盾的对立统一
这点和马克思主义哲学上的“矛盾对立统一”是一致的,矛盾的同一性的第三条就讲到:
矛盾双方在一定条件下相互转化。你能变成我,我能变成你。
4.2 数学函数
这点和数学的一些函数很相似,正弦函数为例(虽然不完全一致,思想是一致的),它是有范围的-1到1,到最高点则会降低。
三、思考
我们遇到问题要从根本上去理解它,而不是仅仅观察这个现象,知道怎么解决这个问题。
另外我们要尝试把各个学科的思想结合在一起帮助自己去理解知识点。
创作不易,如果觉得本文对你有帮助,欢迎点赞,欢迎关注我,如果有补充欢迎评论交流,我将努力创作更多更好的文章。
另外欢迎加入我的知识星球,知识星球ID:15165241 一起交流学习。
https://t.zsxq.com/Z3bAiea 申请时标注来自CSDN。
整数溢出体现的哲学道理相关推荐
- 殊途同归的CVE-2012-0774 TrueType字体整数溢出漏洞分析
1. 前言 官方的漏洞通报中,关于这个漏洞的信息其实很少: Integer overflow in Adobe Reader and Acrobat 9.x before 9.5.1 and 10.x ...
- BUUCTF-pwn2_sctf_2016(整数溢出+泄露libc)
32位开启了nx保护 没有看到system和'/bin/sh',开启了NX保护,是泄露libc类型的题目 main函数就调用了一个vuln函数 7行的输入函数不是get,是程序自定义的函数get_n ...
- Android libcutils库中整数溢出导致的堆破坏漏洞的发现与利用
作者:龚广(@oldfresher) 阅读本文之前,您最好理解Android中的Binder机制.用于图形系统的BufferQueue原理.堆管理器je_malloc的基本原理. 此文介绍了如何利用l ...
- 转载:力扣:整数翻转(难点:整数溢出)
(力扣)LeetCode刷题之整数反转 陈鹏 既存一息,多言无益. 关注他 8 人赞同了该文章 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 1: 输入: 123 ...
- C++两个整数的总和是否为整数溢出的算法实现(附完整源码)
C++两个整数的总和是否为整数溢出的算法实现 C++两个整数的总和是否为整数溢出的算法实现完整源码(定义,实现,main函数测试) C++两个整数的总和是否为整数溢出的算法实现完整源码(定义,实现,m ...
- 语言余一个负数_C语言学习日记(8)——整数溢出
小时候喜欢玩电子计算器,觉得很神奇,想要算什么数,立刻就能算出来.当时看着计算器的液晶屏幕就想,如果算一个很大的数,超过了屏幕上面数字的位数,会怎么样呢?试了以后结果是INF,那就是无穷大了.虽然当时 ...
- xp正版验证补丁_实操web漏洞验证——IIS HTTP.sys 整数溢出漏洞
一.漏洞描述 Http.sys 是一个位于 Windows 操作系统核心组件,能够让任何应用程序通过它提供的接口,以 Http 协议进行信息通讯.微软在 Windows 2003 Server 里引进 ...
- linux内核io源码,Linux Kernel do_io_submit()函数整数溢出漏洞
发布日期:2010-09-21 更新日期:2010-09-27 受影响系统: Linux kernel 2.6.x 不受影响系统: Linux kernel 2.6.36-rc4 描述: ------ ...
- 一种被忽视的构造和整数溢出重现
Michael Howard Secure Windows Initiative 摘要:Michael Howard 研究了一种常常被忽略的代码构造,这种构造可能会导致严重的缓冲区溢出问题,然后介绍了 ...
最新文章
- bzoj 1572: [Usaco2009 Open]工作安排Job
- 项目总结二:人脸识别项目(Face Recognition for the Happy House)
- 2020年高等数学方法与提高(上海理工大学)学习笔记汇总
- 11月11日:一个人的情人节
- python递归面试题_汉诺塔问题其实很简单 Python 递归经典面试题
- 快手联合创始人银鑫卸任A站法定代表人、董事、经理
- 拼团商城小程序高保真原型模板、支付、优惠券、客服、物流、收藏、足迹、优惠券、订单管理、评价、设置、地址、售后、拼团、消息通知、商城小程序、电商小程序、拼团电商、移动端电商、高保真电商、电商app
- 网络限流linux,DockOne微信分享(一九八):容器网络限流实践
- 盘点五款好用的项目管理软件
- app内嵌h5一键加QQ群
- 星星之火-7:从数值空间理解模拟信号、离散信号、数字信号的区别
- IT十大最尴尬瞬间 盖茨遭遇Win98死机列榜首
- Apache FOP生成PDF
- Android中关于涉及到金钱计算方面的工具类!
- Arduino播放声音
- 手机如何打开开发者模式
- 用sockets打造自己的Android聊天app(安卓篇)
- Latex中如何加粗字体 如何打出圆圈序号
- python 小说 小说_我用Python实现了一个小说网站雏形
- 一笔画(AC)DFS算法
热门文章
- php数组填空题,php数组练习十六道题
- 强制删除pod报:Immediate deletion does not wait for confirmation that the running resource...
- Arrays.asList contains int无效
- 苹果手机清理喇叭灰尘_手机屏幕灰尘太多,这样清理一下就能彻底的看不见任何指痕了...
- 浅谈Geronimo的现状
- c语言程序设混分,lol:自己C不起来?学会它让你混分如鱼得水
- lodop打印html页面
- C++入门 aabb
- elementui tree获取父节点_vue_elementUI_ tree树形控件 获取选中的父节点ID
- dd-mon-yy字符串转时间