我找到了一些文章,我看到了这个:
// Capture vendor string
char vendor[0x20];
memset(vendor, 0, sizeof(vendor));
*reinterpret_cast<int*>(vendor) = data_[0][1];
*reinterpret_cast<int*>(vendor + 4) = data_[0][3];
*reinterpret_cast<int*>(vendor + 8) = data_[0][2];
此行:char vendor[0x20];
。 为什么这些都是十六进制的,我可以用八进制的值吗?
CPUID
为什么是十六进制
因为作者选择使用十六进制。 如您所见,0x20在十六进制中相当“圆”,因为它只有一个非零数字。
我可以使用八进制值吗?
是的。 在任何可以使用整数文本的地方,都可以使用任何可用的基表示形式。 二进制,十进制,八进制和十六进制是选项。
附注。 在标准C++中,这个例子在技术上是被打破的,因为它无法对齐缓冲区,所以它不是一个学习该语言的好例子。 我似乎是专门为x86处理器编写的,而x86处理器确实可以处理未对齐的操作。
正确的编写方法应该是使用整数数组,复制值,然后在读取时将结果重新解释为字符。
字符供应商[0x20];
创建长度为0x20
的字节数组,十进制为32。 使用十六进制文字和十进制文字之间没有什么区别,所以我的猜测是代码的原作者认为这样会更易读。 *reinterpret_cast
基本上将vendor作为一个char*
输入,并返回一个int*
,然后使用data_
数组将其分配给该数组。 vendor+4
基本上是vendor
数组的偏移量。 在本例中,vendor
实际上被视为指向数组开头的char*
。 通过编写vendor+4
,您基本上是在创建一个指向数组中第4个元素的指针。 另一种方法是编写&vendor[4]
。