我正在查看用C编写的项目的源代码。这是一个已定义的选项列表(这些不是真正的定义......不是很具描述性!)
...
#define OPTION_5 32768
#define OPTION_6 65536
#define OPTION_7 0x20000L
#define OPTION_8 0x40000L
#define OPTION_9 0x80000L
我想添加一个新选项OPTION_10
但在我这样做之前,我想了解十六进制数字究竟代表什么?
这些数字是否会转换为预期的十进制值131,072 262,144 524,288?如果是这样,为什么不保持与早期选项相同的格式?
答案 0 :(得分:3)
这些数字是否转换为预期的十进制值131,072
是。您可以使用Google进行转换:搜索“0x20000 in decimal”。
如果是这样,为什么不保持与早期选项相同的格式?
我想这只是因为程序员知道他们的两个高达65536的权力并且更喜欢十六进制,在那之上它们更容易识别。
L
后缀强制输入文字常量至少为long int
,,但如果需要保持常量,则所选类型可能仍然更大。程序中可能没有必要使用它,因为他/她不理解强调条款。细节详情见C99标准第56页6.4.4.1。
答案 1 :(得分:2)
进一步考虑添加到现有答案中,我更喜欢定义这样的标志:
enum {
OPTION_5_SHIFT = 15,
OPTION_6_SHIFT,
OPTION_7_SHIFT,
OPTION_8_SHIFT,
OPTION_9_SHIFT,
OPTION_10_SHIFT
};
enum {
OPTION_5 = 1L << OPTION_5_SHIFT,
OPTION_6 = 1L << OPTION_6_SHIFT,
OPTION_7 = 1L << OPTION_7_SHIFT,
OPTION_8 = 1L << OPTION_8_SHIFT,
OPTION_9 = 1L << OPTION_9_SHIFT,
OPTION_10 = 1L << OPTION_10_SHIFT
};
这避免了显式计算常量并使插入/删除值等更容易。
答案 2 :(得分:0)
它们代表相同类型的数字,它们都是2的幂。或者,也可以在不同的视角看到它们,它们都是二进制数,只有一个(没有意图)。
他们按照自己的方式编写的一个可能原因(即使原因不是很好)是许多程序员通过hart知道以下序列:
1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
32768
65536
此序列对应于前两个的17个幂。然后事情就不那么容易了,所以他们可能会切换到十六进制(懒得改变所有早期的数字)。
答案 3 :(得分:0)
特定值表示位标志选项,可以与按位OR运算符|
组合使用:
flags = (OPTION_5|OPTION_6);
您将从这些值的二进制表示中看到每个值都有一个唯一的位集,以允许使用按位OR组合它们:
0x8000L = 32768 = 00000000 00000000 10000000 00000000
0x10000L = 65536 = 00000000 00000001 00000000 00000000
0x20000L = 131072 = 00000000 00000010 00000000 00000000
0x40000L = 262144 = 00000000 00000100 00000000 00000000
0x80000L = 524288 = 00000000 00001000 00000000 00000000
0x100000L = 1048576 = 00000000 00010000 00000000 00000000
要查明flags变量中是否设置了标志,可以使用按位AND运算符&
:
if(flags & OPTION_6)
{
/* OPTION_6 is active */
}
答案 4 :(得分:-1)
数字的每个数字代表数字数字系统基数乘以数字位数的乘数,从右到左,从零开始计算。
因此32768 = 8 * 10 ^ 0 + 6 * 10 ^ 1 + 7 * 10 ^ 2 + 2 * 10 ^ 3 + 3 * 10 ^ 4。
(为完整性提示:x ^ 0 = 1,x ^ 1 = x。)
十六进制数有16位(0 - 9,A(~10) - F(~15))因此基数为16,所以0x20 = 0 * 16 ^ 0 + 2 * 16 ^ 1。
二进制数有2位数,基数为2,所以100b = 1 * 2 ^ 2 + 0 * 2 ^ 1 + 0 * 2 ^ 0。
知道你应该能够自己计算其余数据并处理二进制和十六进制数字,理解你列出的每个数字是它的前身的两倍,十六进制数字的十进制数值,行中的下一个十进制数字应该是多少,以及如何在任何数值系统中表达OPTION_10,特别是二进制,十进制和十六进制。