C++中如何获取类型精确位数?readBits函数补零逻辑存疑
问题解答
关于sizeof(target_t) * 8的正确性
用sizeof(target_t) * 8计算类型总比特数,在多数使用标准固定宽度整数类型(如uint8_t、uint16_t、int32_t等)的场景下是可靠的,但存在两个潜在局限:
- 针对有符号整数类型,该计算包含了符号位。如果你的业务逻辑仅关注有效数据位(比如读取无符号位流),可能需要用
sizeof(target_t)*8 - 1表示可存储数据的位数——具体取决于补零逻辑是针对整个类型比特位还是有效数据位。 - 极少数平台存在带填充位的自定义类型,此时
sizeof返回的字节数包含填充部分,*8会把填充位也算入,导致计算位数大于实际可存储数据的比特数。这种场景下,更准确的方式是使用<limits>头文件中的std::numeric_limits<target_t>::digits:- 无符号类型:
digits返回类型总比特数(与sizeof*8结果一致) - 有符号类型:
digits返回除符号位外的有效数据比特数
- 无符号类型:
关于4位场景下的补零必要性
当bitCount小于target_t的总比特数时(比如读取4位存入uint8_t),补零是必要的,不存在“不必要的零”。原因是:readBits仅填充bitCount位的数据,target_t中未被填充的比特位值是未定义的(可能是内存随机垃圾值)。补零操作能确保这些未使用位被置为确定的0值,避免后续逻辑出现不可预期的行为。
比如读取4位得到0b1010,若不补零,uint8_t的高4位可能是0b1111,最终值变成0b11111010;补零后才会得到符合预期的0b00001010。
内容的提问来源于stack exchange,提问作者bott
相关产品推荐
相关产品推荐

