字符串在内存里的存储方式
.
一、整数
在内存里的二进制表达方式很简单:
计算机内存存储方式本来就是用二进制来存储的,所以可以直接存储整数
十进制 | 二进制 |
---|---|
0 | 000 |
1 | 001 |
2 | 010 |
3 | 011 |
那么字符串需要如何存储呢?
.
二、字符串
会使用编号进行存储,可以理解为一个中间编号
例如:
A = 65 = 01000001
字符串A 等于 65编号 等于01000001
这也就是字符集,通过01000001则能存储对应的字符串A
ASCII字符集加上拓展字符一共是256个字符,不包含汉子
所以出现了GB2312,但是还是有很多的字符没有被录用,也不可能一直推出新的字符集来代表字符
所以又出现了通用字符集unicode
那么通用字符集的出现解决了很多字符的存储,比如单个字符我们都能用字符集来进行转换.
如果是多个字符呢?
比如:
存储 egg
那么他们各自字符对应的是
字符 | 二进制 |
---|---|
e | 01100101 |
g | 01100111 |
g | 01100111 |
存储的值为:011001010110011101100111
可是进行存储时,我们如何知道是 01100101 + 01100111 + 01100111 呢?
没有一个明确的边界处理,以及一个长度是无法获取出对应的字符串。
也有可能获取出 0110010101100111 +01100111 这样的结果就不是"egg"了
这个时候就出现了,定长编码和变长编码
.
二、定长编码和变长编码
.
定长编码:
定长编码是会把每个字符都给定最长的字节进行存储,比如最大的字符一共占了4个字节(比喻成四个字节),
那么不管字符是大还是小,都会统一存储为4个字节,这样下来就能清晰的清楚每4个字节代表着什么字符。
缺点:这样会大量的浪费内存空间,因为小的字符完全用不到四个字节。
这个时候就出现了变长编码
.
变长编码:
它会根据字符的长度那标记编码的模版
字符大小 | 二进制 | 说明 |
---|---|---|
[0,127] | 0??? | 第一个0标时是标记字节大小 |
[128,2047] | 110??? 10??? | 第一次出现的8个数字 110 和第二次出现的八位数字 10 这种的代表 此范围的字节大小 |
以此种标记方式,就能清晰的知道一大堆数字的二进制,输出对应的字符串是什么了。
那这么一长串数字是如何存储到内存里呢。
二、字符串结构
1.使用data执行对应数字集的初始位置,这样就知道了第一位二进制数字。
那么结束位置呢。
c语言使用\0的方式来表示,不会限制字符串内容,缺点无法直接存储\0,否则会出现异常.
go语言,会添加一个标时len来存储全部字节的长度。不会限制字符串内容。
…end结束了…