你是否注意过有符号整型的数据表示范围为[-128,127],负数比正数多出了一位!为什么?

以最简单(位数最短)的byte举例

System.out.println(Byte.BYTES);//输出1
System.out.println(Byte.SIZE);//输出8
System.out.println(Byte.MAX_VALUE);//输出127
System.out.println(Byte.MIN_VALUE);//输出-128

按照通常直觉,正负数不是对称的么,为什么负数最小不是-127,又或正数最大是128呢?

byte类型是8bit表示,那么可以表达的状态就有2^8=256个,如果表示无符号整数可以表达最小2进制00000000到最大2进制11111111(=255)共256个数字。

但是JAVA中整型都是有符号,区分就看第一个bit位,第一个bit如果是0则是正数,如果为1则是负数。看到这里就有疑问了,如果第一个bit位表示符号,那么剩下的7位能表示的范围只能是0到2^7-1=127了,岂不是全部数据范围就是-127~127(包括0)共255个数字,先前我们说了,8bit可以表达256个状态,怎么少了一个呢?

原来正0(00000000)和负0(100000000)都是0,计算意义上看也就是重复表达同样的意义,浪费了一个状态表示。为了不浪费资源,尽可能多的存储数据范围,先贤发明了补码表示负数 ,即一个负数可以用对应的正数的补码表示,而补码=(正数)原码取反(=反码)+1

现在我们用定义一个byte变量值是-127,内存如何存储呢?即求补码
1.127的2进制原码=01111111,
2.求反码=源码取反=10000000
3.反码加1后变成10000001,这就是-127的2进制表示

OK,现在反过来看,计算机指令看到一个byte类型变量值是10000001,怎么得到-127呢?
就是上面求补码的逆向过程,
1.发现第一bit位是1,知道这是补码,是负数
2.补码减1 得出反码=10000000
3.反码取反得到原码=01111111,这就是正数127的2进制表示
4.因此10000001的值就是-127

接下来继续解释:

byte的最大值为什么是127?
因为第一个bit是符号位,那么正数最大只能是01111111=2^7 - 1 = 127

0的补码和原码是一样的
按照上面补码的求解过程
0的原码=00000000→反码11111111 + 1→补码00000000(最高进位丢弃),嗯,也就是说正负0只用一个状态表示。

为什么byte最小值是-128?
我们已经了解,每一个正数有一个对应的补码表示负数,但是通过上面的分析,我们发现-127~127(包括0也没有重复表示)共255个状态,还有一个状态10000000没有利用,它是多少呢?
1.发现第一bit位是1,知道这是补码,是负数
2.补码减1 得出反码=01111111
3.反码取反得到原码=10000000=(128)(我们说原码时,并没有提符号位,仅仅是2进制表示)
注意补码和原码一致,似乎可以即表示128,也可表示-128,但注意与前面的定义保持一致,也为方便计算机识别处理,首位是1即是负数,因此只能是-128了。

转载自https://www.jianshu.com/p/35cf507ebe7f

有符号整型的数据范围为什么负数比正数多一个相关推荐

  1. 有符号整型的数据范围为什么负数比正数多一个?

    背景 我们先看Leetcode的这道题目: 标题:50. Pow(x, n) 难度:中等 https://leetcode-cn.com/problems/powx-n/ 实现 pow(x, n) , ...

  2. c语言中int什么意思以及什么是无符号和有符号整型

    int 是整数类型,用于定义变量的类型,有符号,unsigned int 是无符号的整数类型,直白点说有符号无符号整型就是能不能存放负数. 根据程序编译器的不同,整形定义的字节数不同.51类单片机的C ...

  3. 有符号整型和无符号整型

    有符号整型和无符号整型的区别在于怎样解释整数的最高位 对于无符号整型,其最高位被c编译器解释为数据位 对于有符号整型最高位解释为符号位 如果符号位为0则表示为正数 为1则表示为负数 对于具有相同数据位 ...

  4. size_t 和int 无符号整型和有符号整型

    size_t一般用来表示一种计数,比如有多少东西被拷贝等,例如sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建立的最大对象的字节大小.他的意义大致是: 适于计量内存中可容纳的数据项 ...

  5. 负数时的有符号整型和无符号整型的转换

    目录 一.补码 二.负数时的有符号整型和无符号整型的转换 三.关于无符号的笔试题 一.补码 有符号数在计算机中存储,用数的最高位存放符号, 正数为0, 负数为1 例如:有符号数 1000 0011,其 ...

  6. C语言中无符号整型变量赋值负数,负数时的有符号整型和无符号整型的转换

    目录 一.补码 二.负数时的有符号整型和无符号整型的转换 三.关于无符号的笔试题 一.补码 有符号数在计算机中存储,用数的最高位存放符号, 正数为0, 负数为1 例如:有符号数 1000 0011,其 ...

  7. 整型,长整型,无符号整型等 大端和小端(Big endian and Little endian)

    一.大端和小端的问题 对于整型.长整型.无符号整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian ...

  8. c语言interger转char,怎样用c将无符号整型转化为字符型

    公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:怎样用c将无符号整型转化为字符型回答:可以通过函数itoa来转换,int i;char tmpstr[5];itoa(i, tmps ...

  9. C语言无符号整型运算

    下面根据一道题来详细说说无符号整型运算,在这之前大家要先了解一下数据是如何在内存中存储的,参考我之前写的这篇博客:深度剖析数据在内存中的存储_crazy__xieyi的博客-CSDN博客 例题: 下面 ...

  10. 无符号整型和有符号整型的区别,以及无符号整型的使用

    有符号整型: 无符号整型: 注意: 无符号数据表示数量,只有正值 unsigned无符号标识不会改变数据类型的字节大小 无符号型数据打印要将之前的%d,全部替换成%u,如果在vs中没有注意转换,将无符 ...

最新文章

  1. Django框架深入了解_02(DRF之序列化、反序列化)
  2. itchat python_itchat-python搭建微信机器人(附示例)
  3. 2020-11-18 Ubuntu 安装 Chrome
  4. 译文:一个采用 Three.js 的 3D 动画场景制作:飞行者
  5. 测试岗位面试前复习之【测试基础知识篇】
  6. Java锁与线程的那些“不可描述”的事儿
  7. MOGRT视频制作库 Premiere遮罩/转场/特效视频剪辑效果模板库预设
  8. 发布功能完成02《ivx低代码签到系统制作》
  9. 最新总裁导航系统PHP网站源码+开源版
  10. 23个经典营销创业案例,彻底颠覆你的营销思维
  11. java月份简写_Java如何以(MMM)格式显示一个月份的名称?
  12. 如何调试微信内置浏览器应用(企业号、公众号、订阅号)
  13. Python爬取马蜂窝城市游记
  14. 【ML】_00_03_梯度下降
  15. 某在线商店电子产品销售数据分析-RFM分析方法
  16. 基于51单片机火灾报警器设计智能火灾报警系统(水泵灭火功能)项目设计与制作
  17. 发表论文查重率是多少?
  18. StackOverflow网友Bert F发帖提问:哪本最具影响力的书,是每个程序员都应该读的?...
  19. linux之基础shell脚本编程1 基础变量赋值
  20. 信息系统审计——网络空间安全保障第三道防线

热门文章

  1. MSP430学习笔记(一)--从点灯说起
  2. flash读取程序 msp430_MSP430 flash的操作
  3. DKMS:Dynamic Kernel Module Support
  4. 中安证件识别系统介绍
  5. 南丁格尔图文字颜色跟随
  6. linux c: 静态库和动态库的生成和使用
  7. 搜集的育儿电子书下载大全
  8. 数字信号处理声音降噪实验
  9. CAD导入图片怎么操作?简单几步就导入
  10. 如何修改计算机的ip地址在哪里设置路由器,win7系统电脑无线路由器IP地址如何修改?电脑修改路由器IP地址的方法...