Java为什么占用四个字节你知道吗
作者:你这家伙 发布时间:2021-06-16 18:05:22
简单了解计算机为什么要采用二进制表示信息:
因为计算机作为一种电子计算机工具,是由大量的电子器件组成的,在这些电子器件中,电路的通断,电位的高低,用两个数字符号“1”和“0”分别表示容易实现,同时二进制的运算法则也很简单,因此计算机内部通常采用二进制代码来作为内部存储,传输和处理数据,二进制数据是用0和1两个数码来表示的数,它的基数为2(逢二进一,借一当二)
其实最开始使用的并不是二进制,而是十进制,因为人们有十个手指头,手可以表示十个数字,所以十进制是比较合理的,0的概念是之后很久才诞生的,所以是0-10而不是0-9。
电子计算机出现以后,使用电子管来表示十种状态过于复杂,所以所有的电子计算机中只有两种基本的状态,开和关。也就是说,电子管的两种状态决定了以电子管为基础的电子计算机采用二进制来表示数字和数据。常用的进制还有8进制和16进制,在电脑科学中,经常会用到16进制,而十进制的使用非常少,这是因为16进制和二进制有天然的联系:4个二进制位可以表示从0到15的数字,这刚好是1个16进制位可以表示的数据,也就是说,将二进制转换成16进制只要每4位进行转换就可以了。
为什么使用二进制我们了解了,现在就直奔我们主题
二进制位分析
首先计算机只认识二进制。而一个字节是8位二进制,只用0和1来表示状态,那么我们看看一位能表示多少个状态
1 位:0 和 1 也就是2的一次方,最多表示2个状态(要么是0,要么是1)
2 位:00 和 11 也就是2的2次方,最多表示4个状态,也就是(00,01,10,11)
3 位: 000 和 111 也就是2的3次方,最多表示8个状态,也就是(000,001,010,011,100,101,110,111)
……以此类推
8位: 就可以表示2的8次方个状态 = 256个状态
9位:表示2的9次方 = 512个状态
10位:表示2的10次方 = 1024个状态
32位:表示2的32次方 = 4294967296个状态
查看底层源码我们可以看到
而int如果转成十进制的话,那么他们的范围[-231~231 -1],也就是“-2147483648 ~ 2147483647”
计算机为了区分正负数,所以把256个状态一半给了负数,也就是“-128~127”这256个数(因为要正负,所以从8位中拿走以为来表示)
byte 占 1个字节 = 8个比特位 就可以表示2的8次方个数
short占 2个字节 = 16个比特位……
int 占 4 个字节 = 32个比特位
那么为什么int就占了4个字节呢?
在JAVA中一共有八种基本数据类型,它们分别是 byte、short、int、long、float、double、char、boolean
其中byte、short、int、long都是表示整数的,只不过他们的取值范围不一样
byte 占用1个字节 它的取值范围为 -128 ~ 127
内存开销:
byte a = 1; // 00000001
short 占用2个字节,它的取值范围为 -32768 ~ 32767
short a = 1; // 00000000 00000001
int占用4个字节,它的取值范围为 -2147483648 ~ 2147483647
int a = 1; // 00000000 00000000 00000000 00000001
long占用8个字节,它的取值范围为 -9223372036854774808 ~ 9223372036854774807
这里就不写了~
问:所有的int都是占四个字节吗?
回答:不一定是4个字节,他和操作系统有关系,int占多少个字节是由编译器决定的 以前16位系统中int是2个字节的,而现在32位的系统,int是4个字节的,其实现在基本上都是64位系统, 所谓的16位32位64位系统是由cpu决定的,由机器指令的寻址、寄存器位数决定的 os受cpu的限制,但在32位的cpu下16位的os也可以跑 很多os是向前兼容的,就是使以前的程序也能运行,如果编译器本身是16位时代做的,那么os会提供一个模拟16位的子环境供这个编译器使用 非要转牛角尖的话,int只是语言定义里面的一个关键字,只对compiler可见,complier说它是几位就是几位,和os/cpu都没关系
来源:https://blog.csdn.net/wkh18891843165/article/details/119917485


猜你喜欢
- 对于开发游戏项目的同胞来说,Timer 这个东西肯定不会陌生,今天对以前自己经常使用的定时进行了一番小小的总结!没有写具体实现的原理,只是列
- 本文实例讲述了Spring计划任务用法。分享给大家供大家参考,具体如下:一 点睛从Spring3.1开始,计划任务在Spring中的实现变得
- 归并排序里运用到算法里很重要的一个思想——分治法:将原问题分解为几个规模较小但类似于原问题的子问题——《算法导论》。在每一层递归中都有3个步
- 一、Log4net官方网站:https://logging.apache.org/log4net/。下载二进制dll库:包中提供了针对各个版
- 子类重新实现父类的方法称重写;重写时可以修改访问权限修饰符和返回值,方法名和参数类型及个数都不可以修改;仅当返回值为类类型时,重写的方法才可
- 前言在之前的文章我们复习了 ViewGroup 的测量与布局,那么我们这一篇效果就可以在之前的基础上实现一个灵活的九宫格布局。那么一个九宫格
- Android 中在有序广播中添加自定义权限的实例前言;有序广播说明:有序广播因为要处理消息的处理结果,所以要复杂一些。 * sendOrd
- Android WebView 1.首先修改activity.xml中的代码:2.然后MainActivity中的代码:3.最后设置权限:&
- 最近一直在看RecyclerView,较之ListView它确实是灵活多变,给予开发者更多自定义的空间,比如:需要添加头部和尾部、item的
- 注:这里只是说一下sendmessage的一个过程,post就类似的如果我们需要发送消息,会调用sendMessage方法 public f
- 第一步 环境(UBUNTU系统下)sudo apt-get install mono-gmcs mono第二步 建立example.cscl
- 本文实例为大家分享了java利用数组随机抽取幸运观众的具体代码,供大家参考,具体内容如下思想:首先将所有观众姓名生成数组,然后获取数组元素的
- 本文实例讲述了C#通过DataSet读写xml文件的方法。分享给大家供大家参考。具体实现方法如下:DataSet ds = new Data
- 本文实例讲述了C#面向对象编程之猜拳游戏实现方法。分享给大家供大家参考。具体实现方法如下:1.需求现在要制作一个游戏,玩家与计算机进行猜拳游
- spring-MVC实现简单的登录功能,供大家参考,具体内容如下今天我学习了spring-MVC实现简单的登录功能,本篇博客就讲解如何使用s
- 微信对话列表滑动删除效果很不错的,借鉴了github上SwipeListView(项目地址:https://github.com/likeb
- 为什么不用SQLite? 原因多种:除了面向对象和关系数据库之间的阻抗不匹配时,SQLite可能是矫枉过正(带来了更多的开销)对于一些简单的
- 背景在工控软件的开发中很多业务场景就是使用图表控件展示设备和工艺参数。如下图案例:实现思路通常简单的做法是使用图表控件实现,常用的图表控件有
- 解决Android调用系统分享图片给微信,出现分享失败,分享多文件必须为图片格式近期应公司需求,分享多图片到微信的功能,之前一直是用微信自己
- 本文实例讲述了C#控制图像旋转和翻转的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.Co