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



我现在正在学习Java中的文本I/O和二进制I/O。我读到您写入文件的每个值最初都存储在二进制中。对于文本 I/O,各个数字将转换为其相应的 Unicode 值,然后编码为特定于文件的编码,例如 ASCII。对于二进制 I/O,二进制值直接在文件中表示。例如,199 将表示为二进制11000111 0xC7。现在我对一部分感到困惑。如果变量最初存储为二进制格式,则每个数字表示存储的单独字节还是存储为单个字节的整个数字。例如,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解释器是一个程序(知道如何处理它们,在计算中使用它们或显示为字符。

最新更新