【发布时间】:2017-08-30 09:29:22
【问题描述】:
我正在学习位以及内存如何存储整数和其他数据类型。我知道int a = 11 将作为1011 的位存储在内存中。 String b = "11" 将如何存储为位。
【问题讨论】:
-
必须知道“数字”之间的边界,假设流中的十进制将存储为(标记)1011。没有不能解释正确的位。建议业余接触压缩算法,很有意思
我正在学习位以及内存如何存储整数和其他数据类型。我知道int a = 11 将作为1011 的位存储在内存中。 String b = "11" 将如何存储为位。
【问题讨论】:
实际上,大多数机器上的 int 存储为
00000000000000000000000000001011
它将始终使用语言/机器上的字长(或在大多数情况下为 32 位)。
字符串是一个对象。它具有多种属性,并且不同语言的实现可能会有很大差异。对于主要部分,实际的字符串数据,有两种相当典型的存储方式:单独存储长度,或空终止。
无论以何种方式确定长度,字符都存储为字节序列。每个字符的大小取决于语言/编译器设置等。为了支持非英语语言和特殊字符,通常每个字符存储 16 位,但旧语言通常仍使用 8。
字符编码基于旧的 ASCII 表,但新规范涵盖了更多内容。查看 UTF-8 和 UTF-16。
但是,为了理解基础知识,ASCII 表为我们提供了一个可去处。字符串中的每个字符都由一个数字定义,然后将该数字编码为二进制,就像 int 一样。
字符“1”由ASCII码49(十进制)表示,二进制为00110001。整个字符串可能如下所示:
001100010011000100000000
包括一个空终止符。
【讨论】:
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 个位置(字节宽度)和末尾的替换零填充(而不是空格填充)。