Java 位是如何存储在内存中的?(以块的形式?是否可以同时存储多个大小的位?)

Java 位是如何存储在内存中的?(以块的形式?是否可以同时存储多个大小的位?),java,memory,binary,bit,computer-architecture,Java,Memory,Binary,Bit,Computer Architecture,我曾经认为每个内存位置包含8、16、32或64位。所以0101将作为00000101存储在8位机器中(如果是负数,则符号扩展)。这一切都很顺利,直到出于好奇,我用java编写了一个程序,以了解这个系统的更多内部工作 所讨论的方法如下所示: public void printBinaryRep(File f){ try{ FileInputStream inputStream = new FileInputStream(f); int

我曾经认为每个内存位置包含8、16、32或64位。所以0101将作为00000101存储在8位机器中(如果是负数,则符号扩展)。这一切都很顺利,直到出于好奇,我用java编写了一个程序,以了解这个系统的更多内部工作

所讨论的方法如下所示:

public void printBinaryRep(File f){
        try{
            FileInputStream inputStream = new FileInputStream(f);
            int next = 0;
            byte b = 0;
            while((next = inputStream.read()) != -1){
                b = (byte)next;
                System.out.println((char)next + " : "+Integer.toBinaryString(next));
            }
            inputStream.close();
        }
        catch(Exception e){System.out.println(e);}
 }
我从一个说Hello World的文件中得到了这个输出

H : 1001000
e : 1100101
l : 1101100
l : 1101100
o : 1101111
  : 100000
W : 1010111
o : 1101111
r : 1110010
l : 1101100
d : 1100100
除了空间之外,所有的看起来都很好。它有6位而不是8位。 我现在想知道所有这些信息是如何存储在内存中的。如果所有数据都存储在8位块中,比如

你好:1001000110010111011001111

然后,您可以简单地查看每个8位数据块,找出它所代表的数字(以及它所指的ASCII代码)。 当存储不同大小的字符(如6位空格和4位/n)时,它是如何工作的??那么,在一个大的位空间中存储一个小的数字不会浪费很多位吗

我认为我的一些基本理解是错误的(或者可能是程序的某个地方出错了…)。抱歉,如果这个问题听起来很奇怪或太不深入。我只是想知道。我在谷歌上搜索了一下,但没有找到任何相关信息。如果你能告诉我哪里出了错,或者给我指出了正确的方向,我将不胜感激。 谢谢

根据

如果参数为负,则无符号整数值为参数加232;否则 这与论点是一致的。此值将转换为二进制ASCII数字字符串 (基数2)没有额外的前导0

实际上,数据存储实际上要复杂得多。为了提高处理效率,大多数数据类型存储在字边界上,这意味着32位机器上有4个字节,64位机器上有8个字节。数组可以更紧密地打包,因此
char[4]
可能会使用与
char
相同的“实际空间”


Java是一个虚拟机,我不确定它使用的是什么内存体系结构(如果有的话)。

空间也有8位。就是那个整数。toBinaryString不会按您使用它的方式打印前导
0

对于所有的前导
0
位,它实际上在内存中看起来是这样的:

H : 01001000
e : 01100101
l : 01101100
l : 01101100
o : 01101111
  : 00100000
W : 01010111
o : 01101111
r : 01110010
l : 01101100
d : 01100100

您最好使用C和/或汇编语言进行实验,而不是使用Java。这些语言级别较低,直接暴露地址空间

我曾经认为每一个记忆 位置包含8、16、32或64 位。所以0101将存储在一个8 钻头机组件00000101(符号扩展 如果是负数)。这一切都很好 直到我用英语写了一个程序 java出于好奇找到了一些 该系统的更多内部工作

x86系统中的所有内存位置都包含8位(1字节)。如果一个值包含的数据超过了单个字节所能容纳的数据量,则使用多个字节存储该值。例如,在C语言中,“float”类型使用4个字节(32位)存储

所有的看起来都很好,只是有点不对劲 空间它有6位而不是8位。我是 现在想知道这一切是怎么回事 信息存储在内存中。如果 所有数据都存储在8位块中, 像


空间也存储在单个字节中。您的打印代码忘了填充到8个空格。100000==00100000==0x20。

您最初的直觉(大部分)是正确的:所有内存位置都由相同数量的位组成。在所有现代机器上,“字节”中有八位,其中字节是机器可以单独访问的最小内存块


仔细观察你的输出。除空格外,所有数字中都有七位。在二进制表示中,空格恰好以两个零开头,而其他字母以一个开头。

实际上,您的方法是错误的。编码在这里非常重要

如果您使用ASCII,那么您可以很容易地说每个字符存储在一个字节(八位)中,但当编码更改时,您不能这样说

UTF-8对字符串中的每个字符使用一到三个字节(8到24位)。这就是为什么您将看到一个重载,您可以在其中指定inputstream对象上的编码

选择错误的输入流将绝对导致错误的字符串输出。因此,您必须知道文件的编码,才能理解哪个位意味着什么。实际上,fileinputstream为您完成了这项工作

若你们将一个数字存储为字符串,那个么它在硬盘中的长度将为一个字符。就像另一个角色一样

但是,如果使用ASCII编码将123456789存储为字符串,则需要9*8位=72位

如果将其存储为integer(请注意,integer的数据宽度在不同的环境中有所不同),则只需要16位

你也不能确定

H : 01001000
e : 01100101
l : 01101100
l : 01101100
o : 01101111
  : 00100000
W : 01010111
o : 01101111
r : 01110010
l : 01101100
d : 01100100
\n: 00001010
作为H:01000存储在硬盘中 e:01100101 l:01101100 l:01101100 o:0110111 : 00100000 W:01010111 o:0110111 r:011110010 l:01101100 d:01100100 \编号:00001010

你不能肯定这一点。文件系统并不是那么简单。也许Hello是连续的,但World string位于驱动器的末尾。这就是为什么有碎片整理命令

但如果我们在定义字符串时谈论主内存(RAM),我希望位是连续的。至少在C语言中是这样。这样定义一个字符串

char[100] value; // c is a char array. (there is no string type in c)
这里的值[0]是字符串的第一个字符。和仅值地址到内存中的字符数组位置


如果值[0]的地址是10,那么值[1]的地址是10+8=18。

计算机存储数字的方式可以与汽车里程表相比较。如果里程表有4位数字,它将数字33存储为“0033”

如果有人问你的里程数是多少,你不会说“0千0百33”。默认情况下,Java也不会。(尽管你可以告诉它。)

那就不会有一点点了
A: 1000001
B: 1000010
C: 1000011
D: 1000100