布尔类型为何占32个比特位?

布尔类型为何占32个比特位?

​ 学过C语言的同学都知道,我们表示真和假时仅用一个1或者0就好了,比如在while循环中,只要往while()的括号中加一个1,它就会变成一个死循环,往里边加一个0,这个循环就不会执行了,在C语言中的布尔运算的结果也是用0和1来表示的,或者说在C语言中根本没有布尔类型,这个结果用0和1表示即可,那在Java中为何要单独设置一个布尔值,用麻烦的英文表示,而且就这两个值,为什么还要占用32位呢?我们知道32位可以表示2^32个数值,布尔类型仅有两个数值,这样一来就浪费了32位的空间,这是为何呢?下面我将简要探讨这个问题。

​ 和C语言不一样,Java是需要在JVM上编译的,在JVM上编译成机器码Java才能真正的在计算机上运行,因此Java语言里的一些设计需要符合JVM的设计规范,而JVM在运行的时候,是在内存上运行的,因此内存上的一些分配规范,Java语言的设计机制必须与之符合,比如在内存上的最小分配空间并不是1b,而是4kb,这是什么意思?也就是说,无论多小的一个信息,若是想要在如今的内存上存储,其必定会被分配给一块占地大小为4KB的存储空间,不仅内存,硬盘也是如此。我们记为:如今计算机上的最小存储单元是4kb。

​ 为什么是4kb?这就涉及一个硬件知识了,如下有两块大小相同的内存空间:

​ 第一块内存空间被分成了更加致密的多个存储单元,而第二块内存空间被划分的比较稀疏,从利用率上来看,第一块内存空间的利用率确实是增高了,假设第一块内存空间中的页存储单元是1kb,而第二块内存空间中的页存储单元是4kb,那么当我们存储一个1kb以下的信息时,那肯定是第一块内存空间的空间利用率高。但是这也导致了一个问题:想要控制一个内存中的信息的话,你需要它的地址。这就导致在内存页被分的更加致密的时候,我们需要更多的地址信息,就从上面的图来看,第一块内存空间需要15个地址,第二个需要7个地址。在此我们还需了解CPU从内存中读取信息的方式:CPU读取内存中的信息时,是以一个存储单元一次的方式读取的。CPU的读取速度固然很快,但是向内存发出请求的这个过程是消耗时间的,因此每次读取信息的大小不会影响单次读取时间,CPU访问内存并读取一次信息的时间大概在15~29纳秒,因此当我们读取一块固定大小的信息的时候,内存单元被划分的越多,读取时间越长,而内存单元划分的越少,读取时间越短。所以,适当扩大内存单元对于系统的运行速度是有好处的,同时过于致密的内存单元划分会导致需要的地址信息激增,这些信息会非常占据内存以及各级缓存的空间,这对性能的影响也是非常大的。因此,人们经过反复的计算实验后,认为当前内存普遍过g的情况下,将内存页划分为4kb是最好的。当下的大部分计算机中的内存单元的大小都是4kb,硬盘中的最小分区也通常是4kb。实际上读取速度不仅和分区大小有关,也和单个存储单元大小与总存储大小之比有关,实际上,这个比值越大,代表分块越稀疏,读取效率越高,存储效率越低,反之读取效率降低,存储效率增高。内存的单个存储单元大小与总存储大小之比是远远大于硬盘的,因此内存的读写速度比硬盘的快得多,然而之所以这么设计,是因为二者有所偏重,内存更重存取速度,硬盘更重存储,因此有了这样的分配。

​ 因此我们知道了内存单页是4kb的原理,而真正的存储单元的大小与页划分的原理是类似的,存储单元的大小是1b,也就是8个字节,我们之所以不划分成1bit一个存储单元,是因为如果这样划分,地址信息会进一步激增,因此我们通常将内存中的存储单元划分为八个字节,因此如果布尔类型只占用1个字节的话,它会变得无法识别,因为java运行时是在内存中的,内存中最小的变量也是要占用8bit的,也就是说在编译的时候,java只能识别最小8bit的数据信息,无法识别1bit的信息,java是以8bit为一个单位进行数据类型识别的。可见尽管我们可以用1比特的信息表示真假信息,但是我们无法在内存中识别出这1bit的信息,因为内存的最小存储单元就是8bit,而我们如果为了让电脑变得可以识别这1bit,就必须要让内存的最小单位变成1bit,这个行为是得不偿失的,因为它会导致内存信息激增,进而导致内存占用过大。因此我们选择至少使用8bit存储一个信息而不是更小的单位。

​ 然而对于布尔类型我们并没有选择8bit,而是选择了32bit,这实际上是为了加快计算机运行的速度。由上可知,计算机中的存储单元越大,内存单元也好页也好,都会导致计算机存储的加快,而当计算机中的信息趋于增大时,也会让运行速度变快,因为CPU的处理速度很快,导致了时间浪费基本上都用在了读取上,因此程序中的变量变得更大的时候,会让计算机的处理效率得到提升,因为这样一来计算机可以用基本上相同的时间处理更多的数据。同时让在内存中,存储单元尽管是一字节,它的分页是4kb,更大的变量信息实际上是对空间利用率有好处的,因为在java运行时上,任何变量都会被分配一块4kb的空间,因此布尔类型使用32位的空间完全不会产生什么影响,而且它还会让计算机的运行速度变快,这是一件利大于弊的事情,因此我们将布尔类型的大小划分为32比特。

总结:我们将布尔类型划分为32比特的原因是:若划分为1bit计算机会无法识别,如果将存储单元定为1bit会导致电脑卡慢,32bit不会引起浪费并且程序中布尔类型不多,定为32比特不会对空间造成更多的浪费,同时它还会提升系统的运行效率。因此我们将比尔类型定为32比特。

posted @ 2022-01-13 23:47  云杉木屋  阅读(313)  评论(0编辑  收藏  举报