【问题标题】:How is a variable actually stored in memory for Java?Java的变量如何实际存储在内存中?
【发布时间】:2023-04-06 12:26:02
【问题描述】:

我现在正在学习 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 个单独的字节值。我只是对如何措辞感到困惑。希望你能明白我在说什么。谢谢

【问题讨论】:

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

标签: java file memory io binary


【解决方案1】:

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

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

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

您对这些位的解释感到困惑。它们可以表示整数、浮点数、字符、地址……它们的解释方式仅取决于使用它们的程序。

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-10-08
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多