首页 > 编程语言 >java整形取值范围的计算

java整形取值范围的计算

时间:2024-05-26 13:33:11浏览次数:22  
标签:java 整形 补码 127 128 反码 byte 取值 原码

整形取值范围图如下:

1.公式

 -2^(n-1) ~ 2^(n-1)-1    其中n表示该类型共多少个bit位

2.疑惑

按照我的想法最大的取值范围是符号位取0,其他位取1;而最小取值范围只在最大范围基础上符号取反即可,也就是应该是-2^(n-1)-1 ~ 2^(n-1)-1 ,例如:byte类型,最大取值范围01111111,值为127,最小取值11111111,值为-127,也就是范围是-127-127。而这与我们所学的公式矛盾了,根据公式得出的结果应该是-128~127,那么为什么这里多出了-128呢?让我们带着疑惑往下看。

3.原码、反码、补码的引入

我们知道在计算机存储数据用的是二进制数,而我们用二进制表示一个数字例如127,由两部分组成:第一部分是符号位由于127是正数所以符号位为0,第二部分是数值部分127可以二进制表示为1111111,因此两部分组合起来是01111111,这种表示数字的方法得出的二进制数就是原码。

我们不妨用原码来进行一个计算 1-1,但是计算机底层只会做加法,所以我们计算的式子可以表示成1+(-1), 1的原码是00000001,-1的原码是10000001,假定1和-1都是byte类型,我们这里针对byte类型的范围进行讨论,其他整形类似。

   00000001

+ 10000001

------------------

   10000010

1+(-1)的结果是10000010,也就是-2,这显然不正确。因此为了解决这个问题,计算机大牛们发明出了反码,规定正数的反码是其本身,而负数的反码在原码的基础上符号位不变,其他位取反(1变0,0变1)

还是1+(-1),

 1的原码是00000001,   补码就是00000001

-1的原码是10000001,反码就是11111110

   00000001

+ 11111110

------------------

   11111111

得到的是反码和为11111111,转换为原码是10000000,也就是-0,结果只看数值的话是0完全没有问题,可是0就是0,我们不希望还有-0这种存在,于是为了解决这个问题,大牛们又发明了补码,规定正数的补码是其本身,而负数的补码是反码+1。

 1的原码是00000001,   补码就是00000001

-1的原码是10000001,反码就是11111110,补码是11111111

   00000001

+  11111111

------------------

100000000

由于100000000已经有9位了,而我们char类型只有8位,因此最高位1被丢弃,结果是00000000,补码是00000000,其对应原码也是00000000,那么结果就是0,这回1+(-1)计算的结果没有问题了。

4.解释疑惑

在引入了原码、反码、补码的概念之后,我们再对之前的疑惑进行解答。

我们自己期望范围是-127-127。根据公式得出的结果确是-128~127。

我们不妨把目光放在0上,对于能表示0的值来说,明明可以有+0、-0,

但是我们的范围内只要一个0,也就是+0,原码是00000000,它代表了-128~127中的0这个值,

那么-0,原码为10000000去哪了?它和多出的这个-128有什么关系?

-0的原码为10000000,补码为00000000

-128的原码应为110000000,但是byte只有8位,舍弃最高位为10000000,因此补码也为00000000

我们不难看出对于byte来说,-0和-128的原码和补码在byte类型截断后的限制下完全一致,所以在byte类型里面我们可以使用-0也就是10000000来表示-128,因此比我们自己期望范围-127-127多出一个-128,byte的真正范围在-128~127,这种推导其他整形也类似。

标签:java,整形,补码,127,128,反码,byte,取值,原码
From: https://blog.csdn.net/qq_59153009/article/details/139213193

相关文章

  • JavaScript-数组的增删改查
    数组的操作一共有四种:查询数组数据修改数组中元素的值数组添加新的数据删除数组中的元素数组的初始化有些编程语言的数组初始化是用{}包着的,而JS的数组初始化用[]letnum=[2,6,1,77,52,25,7];数组的查询想要具体查询数组中的某个元素可以用数组名num[i]表示查询数组n......
  • 华为OD机试Java - 会议室占用时间
    前言:本专栏将持续更新互联网大厂机试真题,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于大厂机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:[email protected];备注:CSDN。题目描述现有若干个会议,所有会议共享一......
  • 华为OD机试Java - 智能成绩表
    前言:本专栏将持续更新互联网大厂机试真题,并进行详细的分析与解答,包含完整的代码实现,希望可以帮助到正在努力的你。关于大厂机试流程、面经、面试指导等,如有任何疑问,欢迎联系我,wechat:steven_moda;email:[email protected];备注:CSDN。题目描述小明来到某学校当老师,需要将学......
  • java选择题
    题目选自牛客网1.publicinterfaceIService{StringNAME="default";}默认类型等价表示是哪一项:A.publicStringNAME="default";B.publicstaticStringNAME="default";C.publicstaticfinalStringNAME="default";D.privateStringNA......
  • 基础6 探索JAVA图形编程桌面:集合组件详解
            我们的团队历经了数不胜数的日夜,全力以赴地进行研发与精心调试,最终成功地推出了一款具有革命性意义的“图形化编程桌面”产品。这款产品的诞生,不仅极为彻底地打破了传统代码开发那长久以来的固有模式,更是把焦点聚集于解决长期以来一直困扰着开发者的一大难题—......
  • 省钱兄科技:优质JAVA源码,实惠交易
    省钱兄科技:优质JAVA源码,实惠交易的不二之选在当今的信息化时代,软件开发已成为企业发展的重要驱动力。而在软件开发的过程中,选择高质量的源码是确保项目成功的基础。省钱兄科技,凭借其优质的JAVA源码和实惠的交易模式,成为了众多开发者和企业的首选合作伙伴。一、优质JAVA源码,铸......
  • 基于Java宿舍管理系统设计和实现开题报告
    如今,随着大学生人数的不断增长,宿舍管理工作也越来越重要。对于学生来说,宿舍是一个学习、生活和休息的重要场所,因此宿舍管理的质量将直接关系到学生的学习和生活质量。目前,大部分学校的宿舍管理工作还是手工化、纸质化、人工化,存在人力资源配置不合理、效率低下等问题......
  • 【Java学习】第39节:基础数据结构(二):链表
    目录1. 链表1)概述2)单向链表3)单向链表(带哨兵)4)双向链表(带哨兵)5)环形链表(带哨兵)习题E01.反转单向链表-Leetcode206E02.根据值删除节点-Leetcode203E03.删除倒数节点-Leetcode19E04.有序链表去重-Leetcode83E05.有序链表去重-Leetcode82E06.合......
  • Java项目:校园周边美食探索(java+SpringBoot+Mybaits+Vue+elementui+mysql)
    源码获取:俺的博客首页"资源"里下载! 项目介绍基于Springboot+vue实现的校园周边美食探索及分享平台本系统包含管理员、用户两个角色。管理员:用户管理、美食鉴赏管理、好友管理、收藏管理、系统管理用户:登录、注册、个人中心管理、美食鉴赏管理、好友管理、收藏管理......
  • 滑不动窗口的秘密—— “滑动窗口“算法 (Java版)
    本篇会加入个人的所谓鱼式疯言❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言而是理解过并总结出来通俗易懂的大白话,小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的.......