【问题标题】:String stored in memory as bits字符串作为位存储在内存中
【发布时间】:2017-08-30 09:29:22
【问题描述】:

我正在学习位以及内存如何存储整数和其他数据类型。我知道int a = 11 将作为1011 的位存储在内存中。 String b = "11" 将如何存储为位。

【问题讨论】:

  • 必须知道“数字”之间的边界,假设流中的十进制将存储为(标记)1011。没有不能解释正确的位。建议业余接触压缩算法,很有意思

标签: java memory bits


【解决方案1】:

实际上,大多数机器上的 int 存储为

00000000000000000000000000001011

它将始终使用语言/机器上的字长(或在大多数情况下为 32 位)。

字符串是一个对象。它具有多种属性,并且不同语言的实现可能会有很大差异。对于主要部分,实际的字符串数据,有两种相当典型的存储方式:单独存储长度,或空终止。

无论以何种方式确定长度,字符都存储为字节序列。每个字符的大小取决于语言/编译器设置等。为了支持非英语语言和特殊字符,通常每个字符存储 16 位,但旧语言通常仍使用 8。

字符编码基于旧的 ASCII 表,但新规范涵盖了更多内容。查看 UTF-8 和 UTF-16。

但是,为了理解基础知识,ASCII 表为我们提供了一个可去处。字符串中的每个字符都由一个数字定义,然后将该数字编码为二进制,就像 int 一样。

http://www.asciitable.com/

字符“1”由ASCII码49(十进制)表示,二进制为00110001。整个字符串可能如下所示:

001100010011000100000000

包括一个空终止符。

【讨论】:

  • 最后的 8 个 0 将是空终止符,表示字符串的结尾。并不总是使用。
  • 我问这个是因为那些是 24 位的。它会在左侧放一堆零吗?
  • 会有额外的 8 位,是的。我认为字节排序超出了范围,但英特尔的做法与大多数人不同。
  • 在上下文“存储在常量词机器中”的好答案。但答案与可能的问题“什么是最高可能的存储算法”(或多或少的专业压缩)无关
  • 问题是“在内存中”而不是有时用于传输或文件系统存储的东西。用于节省 RAM 的霍夫曼编码的例子很少。
【解决方案2】:
public static void main(String[] args) {
    for(final byte b : "11".getBytes()) {
        String asBinary = String.format("%8s", Integer.toBinaryString(b & 0xFF)).replace(' ', '0');
        System.out.print(asBinary);
    }
}

【讨论】:

  • 所以b & 0xFF 是一个位掩码操作,Integer.toBinaryString 将一个值转换为它的二进制表示形式(例如 110001),String.format 将其打印填充到 8 个位置(字节宽度)和末尾的替换零填充(而不是空格填充)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-07
  • 2022-10-16
  • 2012-08-09
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多