You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么char标称占用1字节8比特,代码观测却仅占用7比特?

问题解答

核心结论

C++ 标准明确规定 char 类型的大小为 1 字节,现代通用计算机系统中1字节固定为8比特,不存在7比特的char。你观测到的结果是两段测试代码的逻辑错误导致的误判。


第一段代码的问题说明

你写的二进制输出逻辑存在缺陷,只会输出从最低位到最高有效位(第一个值为1的比特)的部分,高位的前导0会被直接跳过,并不是不存在。
'a' 的ASCII码值是97,对应的完整8比特二进制为 01100001:

  • 你的代码从低位开始逐位输出,得到的1 0 0 0 0 1 1其实是后7位的倒序结果
  • 最高位的0因为不影响正整数的大小,在val /= 2到最后变成0时循环提前终止,所以没有被打印出来,不是这1比特不存在。

第二段代码的问题说明

你对指针运算的规则理解有误:&arr 是指向整个char数组的指针,它的步长等于整个数组的字节大小。你定义的数组是7个char元素,总大小是7字节,所以&arr + 1的地址自然会比&arr大7字节,和单个char的大小完全无关。
如果要查看单个char元素的地址间隔,应该写成cout << static_cast<void*>(&arr[i]) << endl;,你会看到相邻元素的地址差是1,也就是8比特。


剩余1比特的作用

标准ASCII码确实只用到了低7比特,最高位的使用分场景:

  • 存储标准ASCII字符时,最高位固定为0
  • 如果你用的是有符号char(大多数编译器默认char是有符号的),最高位是符号位,可用来表示-128~127的数值
  • 扩展ASCII编码、多字节编码(比如GBK、UTF-8的多字节单元)会用到这1比特存储额外的编码信息

内容的提问来源于stack exchange,提问作者ramakrishna

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 16:45:05