某位 A 同学发了我一张截图,问为何结果中出现了负数?

问题截图

看了图,我第一感觉就是数据溢出了。数据超出能表示的最大值,就会出现奇奇怪怪的结果。

然后,他继续发了张图,内容是 print(100000*208378),就是直接打印上图的 E[0]*G[0],结果是 20837800000,这是个正确的结果。

所以新的问题是:如果说上图的数据溢出了,为何直接相乘的数却没有溢出?

由于我一直忽视数据的表示规则(整型的上限是多少?),而且对 Numpy 了解不多,还错看了图中结果,误以为每一个数据都是错误的,所以就解答不出来。

最后,经过学习群里的一番讨论,我才终于明白是怎么回事,所以本文把相关知识点做个梳理。

在正式开始之前,先总结一下上图会引出的话题:

  • Python 3 中整数的上限是多少?Python 2 呢?
  • Numpy 中整数的上限是多少?出现整数溢出该怎么办?

关于第一个问题,先看看 Python 2,它有两种整数:

  • 一种是短整数,也即常说的整数,用 int 表示,有个内置函数 int()。其大小有限,可通过sys.maxint() 查看(取决于平台是 32 位还是 64 位)
  • 一种是长整数,即大小无限的整数,用 long 表示,有个内置函数 long()。写法上是在数字后面加大写字母 L 或小写的 l,如 1000L

当一个整数超出短整数范围时,它会自动采用长整数表示。举例,打印 2**100 ,结果会在末尾加字母 L 表示它是长整数。

但是到了 Python 3,情况就不同了:它仅有一种内置的整数,表示为 int,形式上是 Python 2 的短整数,但实际上它能表示的范围无限,行为上更像是长整数。无论多大的数,结尾都不需要字母 L 来作区分。

也就是说,Python 3 整合了两种整数表示法,用户不再需要自行区分,全交给底层按需处理。

理论上,Python 3 中的整数没有上限(只要不超出内存空间)。这就解释了前文中直接打印两数相乘,为什么结果会正确了。

PEP-237(Unifying Long Integers and Integers)中对这个转变作了说明。它解释这样做的 目的:

这会给新的 Python 程序员(无论他们是否是编程新手)减少一项上手前要学的功课。

Python 在语言运用层屏蔽了很多琐碎的活,比如内存分配,所以,我们在使用字符串、列表或字典等对象时,根本不用操心。整数类型的转变,也是出于这样的便利目的。(坏处是牺牲了一些效率,在此就不谈了)

回到前面的第二个话题:Numpy 中整数的上限是多少?

由于它是 C 语言实现,在整数表示上,用的是 C 语言的规则,也就是会区分整数和长整数。

有一种方式可查看:

import numpy as npa = np.arange(2)type(a[0])# 结果:numpy.int32

也就是说它默认的整数 int 是 32 位,表示范围在 -2147483648 ~ 2147483647。

对照前文的截图,里面只有两组数字相乘时没有溢出:100007*4549、100012*13264,其它数据组都溢出了,所以出现奇怪的负数结果。

Numpy 支持的数据类型要比 Python 的多,相互间的区分界限很多样:

numpy的数据类型

c语言int超出范围溢出处理_整数溢出是怎么回事?Python和Numpy的整数为何不一样?...相关推荐

  1. 缓冲区溢出漏洞_缓冲区溢出漏洞简介

    缓冲区溢出漏洞 重点 (Top highlight) 缓冲 (Buffer) A buffer is a temporary storage, usually present in the physi ...

  2. python中排序从小到大_面试官:如何用Python实现三个整数从小到大排序?

    概述 今天主要分享一个三树排序的实例,大家可以自己测试玩一下~ 需求 输入三个整数x,y,z,请把这三个数由小到大输出. 方法一:如果是要练练手就随便找个排序算法实现一下 #usr/bin/pytho ...

  3. c语言int超出范围字符串,Go返回int64类型字段超出javascript Number范围的解决方法...

    Go返回int64类型字段超出javascript Number范围的解决方法 最近在项目中,一个go服务给前端提供了一个接口,返回json格式数据,其中Int64字段会超出javascript Nu ...

  4. mysql4.1.2缓冲区溢出漏洞_缓冲区溢出漏洞

    缓冲区溢出就是在大缓冲区数据向小缓冲区复制的过程中,由于没有注意到小缓冲区的边界,"撑爆"了较小的缓冲区,从而冲掉了和小缓冲区相邻内存区域的其他数据而引起的内存问题.缓冲区溢出是常 ...

  5. gateway 内存溢出问题_内存溢出和内存泄漏、产生原因以及解决方案

    内存泄露是每个开发者最终都要面对的问题,它是许多问题的根源:反应迟缓,崩溃,高延迟,以及其他应用问题. JavaScript 内存管理 JavaScript 是一种垃圾回收语言.垃圾回收语言通过周期性 ...

  6. python语言能做什么游戏好玩_太好玩了我用 Python 制作一款小游戏

    超级玛丽.魂斗罗.坦克大战.冒险岛--提到这些游戏,"80后"."90后"滔滔不绝,掀起一波回忆杀. 最近不少媒体发文称:"小霸王被申请破产" ...

  7. C语言int类型数值溢出会怎么样

    c语言int类型数值占四个字节,就是32位.有符号能表示的范围为-2147483648 ~ 2147483647,无符号数表示的范围0~4294967295. 大于0的数: #include<s ...

  8. c语言程序超出int范围,C++-int类型整数超出范围后的处理

    最近做了一道题目: Given a 32-bit signed integer, reverse digits of an integer. Example 1: Input: 123 Output: ...

  9. 语言余一个负数_C语言学习日记(8)——整数溢出

    小时候喜欢玩电子计算器,觉得很神奇,想要算什么数,立刻就能算出来.当时看着计算器的液晶屏幕就想,如果算一个很大的数,超过了屏幕上面数字的位数,会怎么样呢?试了以后结果是INF,那就是无穷大了.虽然当时 ...

最新文章

  1. python list分成多个_Python3 把一个列表按指定数目分成多个列表的方式
  2. BZOJ 3669: [Noi2014]魔法森林( LCT )
  3. 精简三星Galaxy III 迷你版 自带无用软件
  4. java trrows处理_java 19 -2 异常以及tr...catch()的方法处理异常
  5. primer3批量设计引物
  6. 混沌工程详细介绍——Netflix持续交付实践探寻
  7. Windows下 DirectX SDK 配置检验
  8. 线性代数01:函数对向量、矩阵的梯度(向量、矩阵求导)
  9. FLASH入门常见问题
  10. 安尼泰科T1行车记录仪说明书
  11. JS查询日出日落时间和太阳月亮位置
  12. (Adventure项目)自行车业务数据分析报告(三)
  13. Python挑战游戏( PythonChallenge)闯关之路Level 0
  14. python多元回归分析_多变量分析:多元回归分析
  15. P13 JPanel 面板
  16. java类嵌套_java-嵌套类
  17. php源码织梦,织梦DedeCms V6官方最新版下载
  18. 解决json string转object,value值存在英语双引号,无法解析问题
  19. 《电商系统后台统计报表模块》需求分析与设计的课程小结
  20. 独家揭秘!抖音爆款漫画变身特效的背后技术

热门文章

  1. docker compose dns 缓存_Docker深入浅出 | Docker Compose多容器实战
  2. 吃鸡电脑配置清单_2020年5月份最佳组装电脑配置清单,吃鸡联盟总有满足你的...
  3. eclipse关闭js校验
  4. nginx ---- nginx.conf核心配置文件
  5. mysql 数据库表重建_mysql 数据库表重建
  6. python函数如何结束_如何在Python中结束函数
  7. 冷热分离和直接使用大数据库_「系统架构」如何通过分离冷热数据提升系统性能?...
  8. linux用户和用户组及权限管理
  9. 学习笔记之rpm程序包管理功能解析
  10. Java 的内存分类