个人博客:The Blog Of WaiterXiaoYY 欢迎来互相交流学习。

前言

虽然之前学过《计算机组成原理》,也理解了原码、补码、反码等东西,但终究还是理解不够深刻,

最近在做位运算类型的题目的时候,脑子突然闪过到一个问题,

为什么 int 型数据类型的取值范围不对称呢?

为什么最大值是 2^31 - 1呢?

为什么最小值是 -2^31,而不是-2^31 + 1呢?

正如标题中所说,很惭愧,直到今天才真正弄明白,

但亡羊补牢,终究未晚。

正 负 数在计算机中的表示

我们知道,计算机能够认识的只有二进制(也就是 0 和 1),而我们所认识的字符和数字都要转换成二进制才能让计算机识别并执行。

这里以java的int型为例说明,

我们首先要明白的是,

java的 int 型是32位的,

因为一个 int 值占 4 个字节 byte ,一个字节是 8 位 bit(即8个二进制位),所以 int型 占 32 位,

其中第32位,也就是最高位是符号位,正数为 0,负数为 1

剩下的31位是用来表示数字部分。

正数

正数在计算机中表示为 原码

比如:

1 的原码是 :0000 0000 0000 0000 0000 0000 0000 0001

1 的补码是:0000 0000 0000 0000 0000 0000 0000 0001

1 的反码是:0000 0000 0000 0000 0000 0000 0000 0001

没错,正数的 原码 、补码 、 反码 都相同

那么最大是多少呢?

当然是除了符号位,其他位置上都为 1 的时候,

0111 1111 1111 1111 1111 1111 1111 1111

这个数就是 2147483647,它是 32 位中所能表示的最大正数。

负数

负数在计算机中表示为 补码

比如:

-1 的原码是:1000 0000 0000 0000 0000 0000 0000 0001

-1 的反码是:1111 1111 1111 1111 1111 1111 1111 1110

-1 的补码是:1111 1111 1111 1111 1111 1111 1111 1111

很明显,负数的 原码 、补码 、 反码 并不相同

而且,

负数的原码 是在 正数的原码 上 将符号位取反 取反

负数的反码 是在 负数的原码 上 除符号位后 取反

负数的补码 是在 负数的反码加一

负数的补码 也可以说是在 负数的原码取反加一

所以我们再来看看 -2147483647 的表示,

-2147483647 的原码是:1111 1111 1111 1111 1111 1111 1111 1111

-2147483647 的反码是:1000 0000 0000 0000 0000 0000 0000 0000

-2147483647 的补码是:1000 0000 0000 0000 0000 0000 0000 0001

那它是最小值吗?

不是,还有一个很奇怪的东西。

0 在计算机中的表示

在二进制中,0 有两种表示方法,

+0 的原码:0000 0000 0000 0000 0000 0000 0000 0000

-0 的原码:1000 0000 0000 0000 0000 0000 0000 0000

因为 0 只需要一个,所以就把 -0 当成了最小的数 -2147483648

可以这么理解,正因为 0 有两种表示方式,所以会多了一个负数出来,

-2147483648 的补码就是:1000 0000 0000 0000 0000 0000 0000 0000它在 32位里面是没有原码的

但需要注意的是,这个补码并不是真正的补码,

真正的补码应该是 1100 0000 0000 0000 0000 0000 0000 0000,但在 java 中溢出了,

所以,就是1000 0000 0000 0000 0000 0000 0000 0000

经过上面,还可搞懂为什么8位的范围是[-128, 127],是不是有点绕?

嗯,我也觉得,但总算有点恍然大悟的样子。


整理于 2020.4.13

惭愧!直到今天才真正明白为什么int型的取值范围是-2^31~2^31-1相关推荐

  1. int型的取值范围是?

    int型的取值范围是? 为什么 int 型数据类型的取值范围不对称呢? 为什么最大值是 2^31 - 1呢? 为什么最小值是 -231,而不是-231 + 1呢? 我们知道,计算机能够认识的只有二进制 ...

  2. int类型变量的取值范围?

    int类型变量的取值范围? 前言 在学C语言的时候应该都会先了解各种基本数据类型的初值和它们的取值范围,有些人可能会不太重视这块内容,其实很重要,很多大公司面试的过程中都会问到int的取值范围,溢出之 ...

  3. int类型变量的取值范围

    int类型变量的取值范围? 前言 前言 在学C语言的时候应该都会先了解各种基本数据类型的初值和它们的取值范围,有些人可能会不太重视这块内容,其实很重要,很多大公司面试的过程中都会问到int的取值范围, ...

  4. int 类型的取值范围

    大伙都知道int类型的 取值范围是 -2147483648 到 2147483647         那为什么不是                              -2147483647 到 ...

  5. 整型int数据的取值范围是怎么来的?

    引言 大家都知道占2个字节的int类型,取值范围是-128~127:那么这个-128究竟是怎么来的呢? 正文 以java语言中的byte类型为例,byte占用1个字节byte,共8个bit:也就是8个 ...

  6. Int类型变量的取值范围为何是2的31次方?

    Int类型变量的取值范围解释 Int类型数据的取值范围为:-2147483648 ~2147483647,即 - 231 ~ 231 -1. 首先:在C++中一个Int类型变量占4个字节,即32位,而 ...

  7. 关于java中int类型的取值范围等问题

    java中int类型取值范围问题 java中int的类型占4个字节,与操作系统无关,要弄明白int的取值范围问题. 首先,我们来看一下byte的取值范围 byte 大小一个字节. 如:1111 111 ...

  8. MySQL创建无符号整数(int)及取值范围

    文章目录 1. 取值范围介绍 2. 创建操作 2.1. 使用Navicat 2.2. 命令 1. 取值范围介绍 官方帮助:Integer Types (Exact Value) - INTEGER, ...

  9. 为什么Int类型的取值范围是2的31次方减1

    今天面试中被问到这个问题,之后认认真真的想了这个问题,因此记录一下.嘘嘘,莫笑. 数据在计算机里面以2进制存储.正整数就是以二进制存储.负整数以补码存储.一个Int类型数据占据空间4字节.每个字节8位 ...

最新文章

  1. MyBatis Plus入门
  2. 使用nginx部署项目的相关资料
  3. PO增强,明细动抬头动
  4. 网络编程之---广播和IP多播
  5. 前端学习(360):svn操作前期连接工作
  6. 阿里一面 缓存穿透、缓存击穿、缓存雪崩和热点数据失效问题的解决方案
  7. 机器人出魔切还是三相_工业机器人常见故障和修理方法
  8. 浏览器可以用c语言编辑吗,如何在浏览器端运行c/c++语言编写的代码
  9. 记录使用 Golang math/rand 随机数遇到的坑
  10. python三本经典书籍-关于 Python 的经典入门书籍有哪些?
  11. js面向对象--理解闭包
  12. 用EXCEL来解决同期比较的问题
  13. 编辑器笔记——sublime text3 编译sass
  14. Java实现文件批量重命名
  15. c语言程序设计教程pdf下载,C语言程序设计教程PDF合集-中国科技大学.pdf
  16. 使用Data studio开发opengauss数据库
  17. 缠中说禅形态挖掘之七笔形态
  18. 白领控诉:被逼下乡5年,我们的幸福何处寻找
  19. c#自定义类的指定字段排序
  20. STM32F103_study55_The punctual atoms(STM32 PWM output experimental theoretical knowledge)

热门文章

  1. Solidity基本介绍
  2. 贪心算法之找硬币问题
  3. 日常生活中长高应该吃什么?
  4. MongoDB 未授权访问漏洞利用
  5. 政务外网、政务专网、政务内网
  6. 多重共线性初学者指南
  7. uniapp 扫码识别(一维码、二维码)
  8. Centos8 linux安装oracle 19c rpm
  9. 衡量计算机主机性能的指标,衡量计算机的性能指标有
  10. springmvc相对路径_SpringMVC Web 相对路径与绝对路径