c++ - 二进制数和位标志“x”
问题描述
我正在通过一个网站学习 C++ - learncpp.com,我遇到了一行让我感到困惑的代码,我不知道如何研究它。我回去寻找关于它是什么的解释但找不到它,我只是想知道要查找什么或它叫什么,以便我可以了解更多信息。这是代码:
unsigned char option_viewed = 0x01;
它指的是一个位标志。我感到困惑的是 0x01; 部分。我假设它是十六进制的,但我不确定。谢谢
解决方案
在 C++ 中,您可以用 3 种不同的基数表示整数文字:十进制(基数 10)、八进制(基数 8)或十六进制(基数 16)。以“正常”方式写入的数字(1、13、405、...)被编译器解释为以 10 为底。以 0 开头的数字(01、040、0800、...)被解释为以 8 为底。以 0x 开头的 (0x1, 0x01, 0x800, ...) 被解释为基数 16。
请注意,对于以 16 为基数的数字,您可以在 0x 之后添加任意数量的前导 0。也就是说,0x1、0x01 和 0x00000001 都只是 1。您可能希望包含更多前导 0 的原因是为了对齐代码以提高可读性。正如 John Zwinck 所指出的,人们通常使用十六进制来表示位标志,因为 2 的每个幂都可以用其中一个数字中的 1、2、4 或 8 来写。所以你可能会看到类似
unsigned char red = 0x01; // 1 base 10, 00000001 base 2
unsigned char green = 0x02; // 2 base 10, 00000010 base 2
unsigned char blue = 0x04; // 4 base 10, 00000100 base 2
unsigned char yellow = 0x08; // 8 base 10, 00001000 base 2
unsigned char magenta = 0x10; // 16 base 10, 00010000 base 2
unsigned char cyan = 0x20; // 32 base 10, 00100000 base 2
unsigned char white = 0x40; // 64 base 10, 01000000 base 2
unsigned char black = 0x80; // 128 base 10, 10000000 base 2
实际上每个变量都存储一个数值,但是因为我们使用的是 2 的幂,所以每个值都由一个设置为 1 的不同位表示。由于类型是一个只有 8 位的无符号字符,你永远不会遇到大于 255 的幂,或 0xFF 十六进制,所以 0x 后的两位数就足够了。如果您要存储一个无符号短整数,那么您可能希望将它写为 0x0001,它仍然只是 1,但您很明显它是一个 16 位整数而不是 8 位整数。
您可以在此处阅读有关C++ 中不同数字基数的更多信息。
推荐阅读
- javascript - 在构建 GraphQL 查询和突变时使用这两种方法有什么区别?
- scala - foreach 函数奇怪的行为
- html - 他们是如何制作 a:hover 完整背景颜色的
- excel - 如何使用没有双引号的excel VBA创建文本文件?
- java - 导航抽屉项目不显示任何内容
- xslt-3.0 - 错误:“匹配属性或命名空间节点的累加器规则无效”
- python - MultiValueDictKeyError 与 Post 方法 python django
- angular - 如何将 Ag-grid 与父子关系绑定并在分组时显示父行数据
- azure - 如何监控 Azure 中部署的机器人的运行状况以发现随机停机时间
- javascript - 为什么空参数没有被识别为未定义?