Java 位是如何存储在内存中的?(以块的形式?是否可以同时存储多个大小的位?)
我曾经认为每个内存位置包含8、16、32或64位。所以0101将作为00000101存储在8位机器中(如果是负数,则符号扩展)。这一切都很顺利,直到出于好奇,我用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
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