为什么C ++会分解为半字节?

时间:2016-05-07 04:28:18

标签: c++ binary bits nibble

为什么信息以四位(半字节)的顺序存储?是否有任何特殊原因选择了4位,可能是3位还是5位?我一直在想这个问题,而且我还没有找到一个确定的答案(如果有的话),为什么我们这样分组。

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

c ++中没有将分解信息的机制存储到半字节中。

你最常看到的实现是八位字节,而不是半字节。八位字节表示字节,它是可在c ++中寻址的最小内存单元。

c ++语言中用于表示字节(=> unsigned char)的位数实际上是实现定义的。

答案 2 :(得分:1)

最接近的半字节是相同的是hex格式的数字每个半字节有一个数字...在代码中看到十六进制的原因很简单,它允许共同的8位宽度用完全和仅2个十六进制数字表示的字节,这对于人类习惯来说相当简洁并且不太难。它很容易在精神上转换回二进制,同时不会丢失你在二进制中使用32位或64位值的方式查看哪些数字。

  • 示例:看到0x30000它清除右边的4 * 4 = 16个较低有效位是0,所以它是设置的第17和第18位。这比解释0b110000000000000000或(十进制)1114112更容易,也更不容易出错。

C ++ bit fields允许结构以任意宽度和位置打包,因此您可以创建" nibbles"如果您愿意,但在可能的情况下,CPU缺乏对半字节的任何特殊支持,或者C ++优化器认为从这些指令中获益很少,以至于它没有使用它们,编译的C ++代码将是 - 对存储它们的CPU可寻址存储器单元(字节或字)进行移位和按位ORing和AND运算,就像它可能需要对其他异常宽度字段一样。

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