为什么 C++ 会分解成半字节?
Why does C++ break down into nibbles?
为什么信息以四位(半字节)的序列存储?选择四位而不是三位或五位是否有任何特殊原因?我一直想知道这个问题,但我还没有找到一个明确的答案(如果有的话)为什么我们以这种方式对位进行分组。
C++ 中没有将信息分解为 半字节 的机制。
您在实现中最常看到的是八位位组,而不是半字节。一个八位字节表示一个字节,它是c++中可以寻址的最小内存单元。
用多少位表示一个byte(=>unsigned char
)在c++语言中其实是实现定义的
不能保证信息以四位序列存储。它更有可能存储在 8 位(一个字节)的序列中,
但这完全取决于您的体系结构和 CHAR_BIT
的值。 sizeof
只能 return 你的数据类型的字节大小,sizeof(char)
保证 return 1. 标准没有规定一个字节是 8 位。
最接近相关的半字节是 hex 格式的数字每个半字节有一个数字......在代码中看到很多十六进制的原因很简单,它允许常见的 8 位字节宽度只用 2 个十六进制数字来表示,这相当简洁,而且对人类来说不太难习惯。脑子里很容易将其转换回二进制,同时又不会像使用 32 位或 64 位二进制值那样忘记正在查看的数字。
- 示例:看到 0x30000 很明显右侧的 4*4=16 个低位为 0,因此第 17 位和第 18 位被设置。这比解释 0b110000000000000000 或(十进制)1114112.
更容易,也更不容易出错
C++ bit fields 允许结构以任意宽度和位置打包,因此您可以根据需要创建 "nibbles",但很可能 CPU 缺乏任何特殊支持对于半字节,或者 C++ 优化器认为从此类指令中获益的频率如此之低以至于它懒得使用它们,编译后的 C++ 代码将进行位移和按位 ORing 和 ANDing into/from the CPU-保存它们的可寻址内存单元(字节或字),就像它可能必须为其他不寻常宽度的字段做的那样。
一些 CPU 支持 Binary Coded Decimal 数字表示,其中每个小数位占用一个半字节,但 C++ 标准不支持。
为什么信息以四位(半字节)的序列存储?选择四位而不是三位或五位是否有任何特殊原因?我一直想知道这个问题,但我还没有找到一个明确的答案(如果有的话)为什么我们以这种方式对位进行分组。
C++ 中没有将信息分解为 半字节 的机制。
您在实现中最常看到的是八位位组,而不是半字节。一个八位字节表示一个字节,它是c++中可以寻址的最小内存单元。
用多少位表示一个byte(=>unsigned char
)在c++语言中其实是实现定义的
不能保证信息以四位序列存储。它更有可能存储在 8 位(一个字节)的序列中,
但这完全取决于您的体系结构和 CHAR_BIT
的值。 sizeof
只能 return 你的数据类型的字节大小,sizeof(char)
保证 return 1. 标准没有规定一个字节是 8 位。
最接近相关的半字节是 hex 格式的数字每个半字节有一个数字......在代码中看到很多十六进制的原因很简单,它允许常见的 8 位字节宽度只用 2 个十六进制数字来表示,这相当简洁,而且对人类来说不太难习惯。脑子里很容易将其转换回二进制,同时又不会像使用 32 位或 64 位二进制值那样忘记正在查看的数字。
- 示例:看到 0x30000 很明显右侧的 4*4=16 个低位为 0,因此第 17 位和第 18 位被设置。这比解释 0b110000000000000000 或(十进制)1114112. 更容易,也更不容易出错
C++ bit fields 允许结构以任意宽度和位置打包,因此您可以根据需要创建 "nibbles",但很可能 CPU 缺乏任何特殊支持对于半字节,或者 C++ 优化器认为从此类指令中获益的频率如此之低以至于它懒得使用它们,编译后的 C++ 代码将进行位移和按位 ORing 和 ANDing into/from the CPU-保存它们的可寻址内存单元(字节或字),就像它可能必须为其他不寻常宽度的字段做的那样。
一些 CPU 支持 Binary Coded Decimal 数字表示,其中每个小数位占用一个半字节,但 C++ 标准不支持。