Bit和Byte的关系
曾经有个师哥问我32位系统和64位系统中一个字节分别对应几位。
当时我还没毕业,想你说的什么玩意儿。。
写了一年多传输层的代码之后才牢牢记住,无论哪个系统一个字节永远都对应8位。
字节 = byte, 位 = bit, 1byte = 8bit
byte是计算机的最小储存单位,bit为计算机的最小逻辑单位
32位CPU代表每次(不是每秒)CPU可以运算32个0/1逻辑,64位则是64个
位域 (Bit Field)
在TCP层经常会使用到少于一个byte (8bit) 的标记位,因为计算机储存的最小单位是byte
所以需要对byte拆分的时候就会用到位域
1 |
|
分析输出我们会发现
- 当小于 2^4 = 16 时,数字都可以正常的被转化成int
- 当大于 2^4 = 16 时,因为越界,结果会被减去16
1 | value: first = 1 |
字节对齐
字节对齐是另一个常见问题,原因在于CPU为了提高效率,会利用一些冗余空间把字节对齐成某个固定值的整数倍
但是对于我们操作byte结果很不方便,比如以下三个结构体在内存中占用的空间
1 | //char 位于 int 之前 |
通过对sizeof来看他们在内存中实际占用的空间,例如
1 |
|
分析输出,首先打印基本类型在内存中的空间
char(1byte = 8bit), int(4byte = 32bit), short(2byte = 16bit), double(8byte = 64bit)
然后无论 value_1 还是 value_2 无论我的数据组成顺序,都是 8byte > 1byte + 4byte (char + int)
这种利用3byte的冗余空间来保存结构体的优化,就是称为字节对齐,字节对齐的规则一般是使用整个结构体中最长的那个
如果我们声明使用 pack(1) 使用1byte进行对齐,则可以获得不包含冗余空间的内存结构 5byte = 1byte char + 4byte int
1 | sizeof char : 1 |