有符号整型的数据范围为什么负数比正数多一个
你是否注意过有符号整型的数据表示范围为[-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
有符号整型的数据范围为什么负数比正数多一个相关推荐
- 有符号整型的数据范围为什么负数比正数多一个?
背景 我们先看Leetcode的这道题目: 标题:50. Pow(x, n) 难度:中等 https://leetcode-cn.com/problems/powx-n/ 实现 pow(x, n) , ...
- c语言中int什么意思以及什么是无符号和有符号整型
int 是整数类型,用于定义变量的类型,有符号,unsigned int 是无符号的整数类型,直白点说有符号无符号整型就是能不能存放负数. 根据程序编译器的不同,整形定义的字节数不同.51类单片机的C ...
- 有符号整型和无符号整型
有符号整型和无符号整型的区别在于怎样解释整数的最高位 对于无符号整型,其最高位被c编译器解释为数据位 对于有符号整型最高位解释为符号位 如果符号位为0则表示为正数 为1则表示为负数 对于具有相同数据位 ...
- size_t 和int 无符号整型和有符号整型
size_t一般用来表示一种计数,比如有多少东西被拷贝等,例如sizeof操作符的结果类型是size_t,该类型保证能容纳实现所建立的最大对象的字节大小.他的意义大致是: 适于计量内存中可容纳的数据项 ...
- 负数时的有符号整型和无符号整型的转换
目录 一.补码 二.负数时的有符号整型和无符号整型的转换 三.关于无符号的笔试题 一.补码 有符号数在计算机中存储,用数的最高位存放符号, 正数为0, 负数为1 例如:有符号数 1000 0011,其 ...
- C语言中无符号整型变量赋值负数,负数时的有符号整型和无符号整型的转换
目录 一.补码 二.负数时的有符号整型和无符号整型的转换 三.关于无符号的笔试题 一.补码 有符号数在计算机中存储,用数的最高位存放符号, 正数为0, 负数为1 例如:有符号数 1000 0011,其 ...
- 整型,长整型,无符号整型等 大端和小端(Big endian and Little endian)
一.大端和小端的问题 对于整型.长整型.无符号整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节):而 Little endian ...
- c语言interger转char,怎样用c将无符号整型转化为字符型
公告: 为响应国家净网行动,部分内容已经删除,感谢读者理解. 话题:怎样用c将无符号整型转化为字符型回答:可以通过函数itoa来转换,int i;char tmpstr[5];itoa(i, tmps ...
- C语言无符号整型运算
下面根据一道题来详细说说无符号整型运算,在这之前大家要先了解一下数据是如何在内存中存储的,参考我之前写的这篇博客:深度剖析数据在内存中的存储_crazy__xieyi的博客-CSDN博客 例题: 下面 ...
- 无符号整型和有符号整型的区别,以及无符号整型的使用
有符号整型: 无符号整型: 注意: 无符号数据表示数量,只有正值 unsigned无符号标识不会改变数据类型的字节大小 无符号型数据打印要将之前的%d,全部替换成%u,如果在vs中没有注意转换,将无符 ...
最新文章
- Django框架深入了解_02(DRF之序列化、反序列化)
- itchat python_itchat-python搭建微信机器人(附示例)
- 2020-11-18 Ubuntu 安装 Chrome
- 译文:一个采用 Three.js 的 3D 动画场景制作:飞行者
- 测试岗位面试前复习之【测试基础知识篇】
- Java锁与线程的那些“不可描述”的事儿
- MOGRT视频制作库 Premiere遮罩/转场/特效视频剪辑效果模板库预设
- 发布功能完成02《ivx低代码签到系统制作》
- 最新总裁导航系统PHP网站源码+开源版
- 23个经典营销创业案例,彻底颠覆你的营销思维
- java月份简写_Java如何以(MMM)格式显示一个月份的名称?
- 如何调试微信内置浏览器应用(企业号、公众号、订阅号)
- Python爬取马蜂窝城市游记
- 【ML】_00_03_梯度下降
- 某在线商店电子产品销售数据分析-RFM分析方法
- 基于51单片机火灾报警器设计智能火灾报警系统(水泵灭火功能)项目设计与制作
- 发表论文查重率是多少?
- StackOverflow网友Bert F发帖提问:哪本最具影响力的书,是每个程序员都应该读的?...
- linux之基础shell脚本编程1 基础变量赋值
- 信息系统审计——网络空间安全保障第三道防线