已编辑:我知道我无法在预处理器中使用 sizeof()
。我正在考虑修改我的代码。
我有使用十六进制值的 C 代码(存储在 unsigned int
类型的变量内):
0x0000'0000'0000'0001 (64-bit/8 Byte system, 15 0's)
0x0000'0001 (32-bit/4 Byte system, 7 0's)
0x0001 (16-bit/2 Byte system, 3 0's)
0x01 (8-bit /1 Byte system, 1 0's)
取决于操作系统决定如何表示unsigned int
(我知道大多数操作系统不会将它们表示为 64'b 值,但请耐心等待)。我想生成一个对象宏,它采用上面四个十六进制值之一,具体取决于操作系统决定如何实现unsigned int
。
执行此操作的一种简单(推测)方法是使用一系列 if-else 语句:
#define SYS_UINT_TYPE sizeof(unsigned int)
#if SYS_UINT_TYPE == 8
#define DEFAULT_MASK 0x0000000000000001
#elif SYS_UINT_TYPE == 4
#define DEFAULT_MASK 0x00000001
...
#endif
但我想知道是否有办法使用 ##
(C 连接运算符)来连接正确数量的 0 以生成正确的 DEFAULT_MASK
宏 -扩展值。我知道对于 B
字节系统,需要与文本文字 0x
连接的 0 的数量是 2B-1
但没有 For-loop
预处理器指令之类的东西。
实际上,这可以减少我必须输入的#if ... #elif ... #endif
的大小。
最佳答案
嗯,这些都是0x01
,对吗?它们是文字,因此如果它们适合 int,它们的大小将是 int...
当掩码完成后,LSB 将与 LSB 对齐...
通过以下方式说服自己:
printf("%lld",(long long) 0x01 | (long) 0x01 | (int) 0x01 | (short) 0x01 | (char) 0x01);
如果这与最高有效位对齐,那么它最终会是这样的:
0x01 00 00 00 00 00 00 00
0x 01 00 00 00
0x 01 00 00 00
0x 00 01 00
0x 01
------------------------- all of this | or'd together
0x01 00 00 00 01 00 01 01
但它只是一个 (0x01
)。
所有这一切都是通过整数提升的魔力来实现的,其中较小的大小被填充为较大存储大小中的相同值......
有符号值和负数会让事情变得更加困惑......部分原因是整数提升规则更加复杂。
关于c++ - 如何使用 C 预处理器生成可变大小(取决于操作系统)的十六进制文字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41774866/