为什么信息以四位(半字节)的序列存储?是否有任何特殊原因选择了四个位,可能是三个位或五个位?我一直想知道这个问题,我还没有找到一个明确的答案(如果有的话)关于为什么我们以这种方式对位进行分组。
3 回答
不能保证信息以四位序列存储。它更有可能存储在 8 位(一个字节)的序列中,但这完全取决于您的架构和CHAR_BIT
. sizeof
只能以字节为单位返回数据类型的大小,并sizeof(char)
保证返回 1。标准并未规定一个字节为 8 位。
c++ 中没有将信息分解为nibbles的机制。
您在实现中看到的主要是一个八位字节,而不是一个半字节。一个八位位组代表一个字节,它是可以在 c++ 中寻址的最小内存单元。
在 c++ 语言中使用多少位来表示一个字节(=> unsigned char
)实际上是实现定义的。
最接近相关的半字节是十六进制格式的数字每个半字节有一个数字......在代码中看到很多十六进制的原因很简单,它允许精确表示常见的 8 位字节宽度和只有 2 个十六进制数字,这相当简洁,而且人类不太难习惯。精神上转换回二进制很容易,同时不会丢失您正在查看的数字,您可以使用二进制的 32 位或 64 位值的方式。
- 示例:看到 0x30000 很明显,右侧的 4*4=16 次有效位是 0,因此设置的是第 17 位和第 18 位。这比解释 0b110000000000000000 或(十进制)1114112 更容易,更不容易出错。
C++位域允许结构以任意宽度和位置打包,因此您可以根据需要创建“半字节”,但在可能的情况下,CPU 缺乏对半字节的任何特殊支持,或者 C++ 优化器认为此类指令的好处很少见它不会费心使用它们,编译后的 C++ 代码将对保存它们的 CPU 可寻址内存单元(字节或字)进行位移和按位 ORing 和 ANDing,就像它可能必须要做的那样为其他不寻常宽度的字段做。
一些 CPU 支持二进制编码的十进制数字表示,其中每个十进制数字占用一个半字节,但 C++ 标准不支持。