-4

为什么信息以四位(半字节)的序列存储?是否有任何特殊原因选择了四个位,可能是三个位或五个位?我一直想知道这个问题,我还没有找到一个明确的答案(如果有的话)关于为什么我们以这种方式对位进行分组。

4

3 回答 3

3

不能保证信息以四位序列存储。它更有可能存储在 8 位(一个字节)的序列中,但这完全取决于您的架构和CHAR_BIT. sizeof只能以字节为单位返回数据类型的大小,并sizeof(char)保证返回 1。标准并未规定一个字节为 8 位。

于 2016-05-07T04:37:19.850 回答
1

c++ 中没有将信息分解为nibbles的机制。

您在实现中看到的主要是一个八位字节,而不是一个半字节。一个八位位组代表一个字节,它是可以在 c++ 中寻址的最小内存单元。

在 c++ 语言中使用多少位来表示一个字节(=> unsigned char)实际上是实现定义的。

于 2016-05-07T04:31:44.593 回答
1

最接近相关的半字节是十六进制格式的数字每个半字节有一个数字......在代码中看到很多十六进制的原因很简单,它允许精确表示常见的 8 位字节宽度和只有 2 个十六进制数字,这相当简洁,而且人类不太难习惯。精神上转换回二进制很容易,同时不会丢失您正在查看的数字,您可以使用二进制的 32 位或 64 位值的方式。

  • 示例:看到 0x30000 很明显,右侧的 4*4=16 次有效位是 0,因此设置的是第 17 位和第 18 位。这比解释 0b110000000000000000 或(十进制)1114112 更容易,更不容易出错。

C++位域允许结构以任意宽度和位置打包,因此您可以根据需要创建“半字节”,但在可能的情况下,CPU 缺乏对半字节的任何特殊支持,或者 C++ 优化器认为此类指令的好处很少见它不会费心使用它们,编译后的 C++ 代码将对保存它们的 CPU 可寻址内存单元(字节或字)进行位移和按位 ORing 和 ANDing,就像它可能必须要做的那样为其他不寻常宽度的字段做。

一些 CPU 支持二进制编码的十进制数字表示,其中每个十进制数字占用一个半字节,但 C++ 标准不支持。

于 2016-05-07T05:29:54.773 回答