对于Java,变量实际上是如何存储在内存中的?

对于Java,变量实际上是如何存储在内存中的?,java,file,memory,io,binary,Java,File,Memory,Io,Binary,我现在正在学习java中的文本I/O和二进制I/O。我读到,您写入文件的每个值最初都以二进制形式存储。对于文本I/O,各个数字将转换为相应的Unicode值,然后编码为特定于文件的编码,如ASCII。对于二进制I/O,二进制值直接表示在文件中。例如,199将表示为0xC7,二进制形式为11000111。现在有一点我很困惑。如果一个变量最初存储为二进制格式,那么每个数字是表示存储的单独字节,还是表示存储为单个字节的整个数字。例如,199最初是否存储为0xc7(二进制格式为11000111)?或者将

我现在正在学习java中的文本I/O和二进制I/O。我读到,您写入文件的每个值最初都以二进制形式存储。对于文本I/O,各个数字将转换为相应的Unicode值,然后编码为特定于文件的编码,如ASCII。对于二进制I/O,二进制值直接表示在文件中。例如,199将表示为0xC7,二进制形式为11000111。现在有一点我很困惑。如果一个变量最初存储为二进制格式,那么每个数字是表示存储的单独字节,还是表示存储为单个字节的整个数字。例如,199最初是否存储为0xc7(二进制格式为11000111)?或者将它存储在3个字节中,每个字节代表数字的二进制值。如果它存储在3个单独的字节中,二进制I/O是否会将3个字节的数字转换为单个字节?如果它存储在单个字节中,那么文本I/O如何将该单个字节转换为3个单独的字节值。我只是不知道怎么用这个词。希望你能理解我的意思。谢谢

计算机唯一能处理的是存储在内存中的0/1位集,如果您愿意,也可以存储在存储设备上。这些位可以流式传输到监视器,并通过图形硬件转换为字符。Sams故事使用键盘,您键入一个键,几位数据将被发送到计算机

位存储在内存中,可由内存地址访问。地址也是一组位

出于实际原因,位被分组为字节、字、长字等。。。一个字节过去是最小的可寻址位单元,在历史上以一组8位结束,目前在大多数硬件中使用。现代内存可以将数据存储在多字节可寻址块中。对于磁盘也是一样,使用特定的寻址机制将数据存储在那里。但无论如何,这些只是一组比特

你所困惑的是那些片段的解释。它们可以表示整数、浮点数、字符、地址等。。。解释它们的方式只取决于使用它们的程序

计算机中不存在字符。它们只是编程语言提供的抽象。程序解释存储在计算机上的位。有标准。例如,ASCII编码将英文字符加上一些特殊字符映射为0到127之间的数字。这些可以放在一个字节中(保留128到255的数字供特殊使用)。打印命令将逐个读取这些字节,并将它们发送到图形中,以便按照编码标准的规定在屏幕上形成字母。不同的编码方案将以不同的方式显示相同的字节

如果您编写了一个带有“hello world”标记的程序,该程序将把引号之间的符号转换为一组11个ascii字节。(在“c”中,它将添加另一个等于“0”的字节,并以这种方式结束字符串)。Unicode是表示字符的另一种方式。每个unicode字符由多个字节的数据表示。还有其他计划。有一件事需要注意。如果您使用某种编码在磁盘上写入字符串,那么您应该使用相同的编码读取它们,否则您的打印将给您带来垃圾。但是,您始终可以将其作为二进制数据进行读取和复制,而无需进行解释


因此,任何类型的任何变量都只是一个抽象,总是由数据字节组成,程序知道如何根据数据类型和/或要执行的操作来解释这些字节。int、double和任何java对象(包括String)类型的变量都是不同大小的字节集。只有程序(java解释器是一个程序)知道如何处理它们,在计算中使用它们或将它们显示为字符。

如果您有一个数字42,您会将4和2分别存储在一个单独的字节中吗?或者你会将42存储在一个字节中吗?是的,这就是我要问的。如果你说的是二进制,那么忘记所有关于文本的内容,因为这会导致混乱。当一个数字在一个二进制文件中表示时,假设您谈论的是8位值,它实际上就是:11000111,正如您所提到的。如果它是16位、32位或64位,它也会有一堆更多的前导零。我希望这能有所帮助。我不知道你所说的“最初存储”是什么意思,也不知道当你的问题是关于文件时,为什么你的标题会说“在内存中”。