嘿,悄咪咪的问你个问题,你觉得整数平方一定大于零吗?
(那不然呢,整数的平方还能小于零不成)
哎,别急着回答
我们先来跑一段C语言代码来看看:

int sq(int x)
{return x*x;
}int main(int argc, char *argv[])
{int i;for (i = 1; i < argc; i++) {int x = atoi(argv[i]);int sx = sq(x);printf("sq(%d) = %d\n", x, sx);}return 0;
}

运行结果如下:

./sq 3
sq(3) = 9
./sq 30000
sq(30000) = 900000000
./sq 50000
sq(50000) = -1794967296

最后一个结果居然是:sq(50000) = -1794967296
(咦?这个五万的平方为什么会是个负数???)
(明明前面的结果是正确的,为什么到这里画风就突然说变就变了?)
别急别急别急!!!
让我们先来看一个表格

类型 存储大小 值范围
char 1 字节 -128 到 127 或 0 到 255
unsigned char 1 字节 0 到 255
signed char 1 字节 -128 到 127
int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
short 2 字节 -32,768 到 32,767
unsigned short 2 字节 0 到 65,535
long 4 字节 -2,147,483,648 到 2,147,483,647
unsigned long 4 字节 0 到 4,294,967,295

也就是说(int)型数据最多只能把
大于等于 -2,147,483,648且小于等于 2,147,483,647
的数字储存在计算机里面。
但为什么会这样呢?
因为在计算机内部,无论任何数据,都是以01储存的

一个0或是一个1就占据了一个比特(bit)
而 通过下面的转换后就变成了我们所熟悉的MB、GB等单位

1B(Byte) = 8bit;
1KB = 1024B(Byte);
1MB = 1024KB(Byte);
1 GB = 1024 MB;

再看刚才的表格, (int)型数据是以4个字节(Byte)的大小、二进制的形式储存在我们的计算机里面,而4个字节 = 32比特。int型数据是以二进制补码的形式储存在我们的计算机里面。

理论上4个字节的零一序列能够表示的最大的数是:
2^32 - 1 = 4,294,967,295
但在这一串零一序列中,它的最高位充当了符号位,符号位为0表示该数为正,符号位为1则表示该数位负,所以真正影响数字大小的是这个符号位后面的31个比特的零一序列,所以 (int)型数据的范围就是从-2,147,483,6482,147,483,647
在了解到这些后,我们在反过头来看代码的运行结果:
当运算3 x 3的时候

十进制的3用二进制表示就是11,3的平方是9,用二进制表示是1001
3的平方运算的结果仅用4个比特就可以表示,相较于int型数据所拥有的31个能够确切表示数字的比特位来说,运算3的平方是绝不会超出它的范围的。
但是当我们运算5万的平方的时候它又发生了什么呢?请看下图:

5万用二进制表示是
1100 0011 0101 0000
它平方的结果用二进制表示是
1001 0101 0000 0010 1111 1001 0000 0000

由于int型数据最多只有32个比特位可以用来储存数据,所以恰好能够把五万的平方的运算结果储存进去。
但是,能够用于精确表示数字的只有后面的31个比特位。
并且,在五万的平方的二进制表示中,它的最高位为1,这就意味着计算机会把它当成一个负数来进行读取,从而展现在我们面前的就是一个负数,而不是一个正数。

最后,回到我们刚刚开始的问题:整数平方一定大于零吗?
或许,在自然界中,上述命题肯定是成立的,但是放在计算机的世界就不一样了。我们应加深自己对计算机的了解,一些在自然界的真命题遇到计算机后就不一定的,我们在编写代码的时候,应该时时刻刻注意这些与我们日常认识不一样的地方,才能够使我们的代码更为健壮。

文章源地址:https://blog.hpjpw.com/

整数平方一定大于零吗?相关推荐

  1. C语言练习题:统计 N 个整数中,大于零或小于零的整数个数(数组)

    实现函数,统计 N 个整数中,大于零或小于零的整数个数 函数定义 int count_plus_or_nega(int numbers[], int n, int plus_or_nega); 参数说 ...

  2. 以下程序从读入的整数数据中,统计大于零的整数个数和小于零的整数个数。用输入零来结束输入,程序中用i统计大于零的个数,用变量j统计小于零的整数。

    标题以下程序从读入的整数数据中,统计大于零的整数个数和小于零的整数个数.用输入零来结束输入,程序中用i统计大于零的个数,用变量j统计小于零的整数. 在这里插入代码片 #include<stdio ...

  3. 编制一个函数jsValue(),求出千位数上的数减百位数上的数减十位数上的数减个位数上的数大于零的个数cnt,再求出所有满足此条件的四位数的平均值pjz1,以及不满足此条件的四位数的平均值pzj2

    已知数据文件IN15.DAT中存有300个四位数,并已调用读函数readDat()把这些数存入数组a中,请编制一个函数jsValue(),其功能是:求出千位数上的数减百位数上的数减十位数上的数减个位数 ...

  4. 财政指标是什么意思_事业单位本年度财政授权支付预算指标数大于零余额账户用款额度下达数,根据两者间的差额”这句话什么意思...

    财政给单位分配的年度指标,单位当年没有用完,有结余指标,即当年单位实际支出数小于预算."零余额账户用款额度"只在单位有授权支付支出时,才由财政下达到单位账户. 第二句意思是财政对于 ...

  5. bigdecimal判断大于零_Python零基础入门(七):运算符

    点击蓝字 一起划水 Review: Python零基础入门(一):对Python的简单认识 Python零基础入门(二):字符串基础 Python零基础入门(三):字符串进阶 Python零基础入门( ...

  6. python一到10整数的平方和_零基础学python_10_列表(创建数值列表 )

    创建数值列表 需要存储一组数字的原因有很多,例如,在游戏中,需要跟踪每个角色的位置,还可能需要跟踪玩家的几个最高得分.在数据可视化中,处理的几乎都是由数字(如温度.距离.人口数量.经度和纬度等)组成的 ...

  7. 大于在python中怎么打出来_在python中,如何检查输入不是空的并且是大于零的数字...

    这是我的建议.在应立即验证并清理输入.通常在接受输入时,最好调用.strip()方法,以防用户错误地输入了额外的空格或制表符.在您读取'm'或'd'值之后,强制将其小写:然后代码的其余部分可以假定它是 ...

  8. matlab多项式拟合要求系数项大于零,matlab多项式系数

    要求一高阶多项式的根往 往须借助数值方法,所 幸MATLAB已将这些数值方法写成一函数 roots(p),我们只要输入多项式的各阶系数 (以 p 代表)即可求解到对应的根 >...... 2. ...

  9. c语言 已知自然对数的底数e用级数表示 忽略绝对值小于,自然对数的底数e大于零 介绍一下自然对数的底e的情况?...

    介绍一下自然对数的底e的情况? 作为数学常数,是自然对数函数的底数.有时称它为欧拉数(Euler number),以瑞士数学家欧拉命名. e=2.71828182-是微积分中的两个常用极限之一.它是( ...

最新文章

  1. PreparedStatement
  2. 财务 计算机网络,计算机网络技术在财务系统中的应用
  3. jmeter线程说明_4.centos下Jmeter+InfluxDB+Grafana环境的搭建1
  4. Can't connect to MySQL server on 'localhost' 10061
  5. python向mysql中添加数据_Django save()方法不向Mysql数据库插入数据
  6. 键盘敲入 A 字母时,操作系统期间发生了什么...
  7. 【Java数据结构】3.1 顺序栈
  8. 改动office outlook 2007默认文件夹的存放位置
  9. error while loading shared libraries: libiconv.so.2: cannot open shared object file
  10. SpringCloud或SpringBoot+Mybatis-Plus利用mybatis插件实现数据操作记录及更新对比
  11. ArrayList 一个面试题
  12. C语言-目标文件/链接文件
  13. Kubernetes详解(二十六)——金丝雀发布
  14. 数据挖掘-电影推荐系统
  15. arm服务器虚拟化云手机,arm虚拟化部署的云手机有哪些优缺点
  16. 软路由保姆级入门教程 一篇看懂软路由
  17. vue-cli3的eslint配置问题
  18. 安全编程: 开发安全的程序
  19. SVG动画和CSS转换:复杂的爱情故事
  20. 华为荣耀8电信卡显示无服务器,华为荣耀手机实现双电信卡双待双通,5步告诉你真相...

热门文章

  1. 高等数学:数列前后项【递推式的单调性】与【整个数列单调性】的关系
  2. html怎么改变网页整体的大小,html设置浏览器大小
  3. ftp连接21端口出现的问题的解决方案
  4. DCOS之Mesos-DNS介绍
  5. ubuntu14.04上安装Mist
  6. 基于web的模型管理系统的设计
  7. 前端常用事件案例——抽名字(抽奖)/搜索下拉菜单/微博文本框
  8. 20150802厦门大学华为校园提前批招聘机试体验题三:Word Maze(单词迷宫)
  9. 钽电容黑色和黄色的区别
  10. oracle profile 参数,oracle profile的参数详解