c++ - 如何使用 C 预处理器生成可变大小(取决于操作系统)的十六进制文字?

标签 c++ c c-preprocessor

已编辑:我知道我无法在预处理器中使用 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/

相关文章:

c - 在 gdb 中使用 STDOUT

c - 为什么结构的大小不等于其各个成员类型的大小之和?

C 头文件和#define 指令

在预处理阶段之后但在汇编阶段之前进行编译

c++ - 同一类型的多个条件赋值 - 性能问题

C++ 内存缓存类

c++ - 如何用C++或C将控制台的内容写入文件,多个进程/exe可能会写入控制台

c# - 如何从 C# 调用 native 库?

c - C:指向结构的指针数组的指针(分配/解除分配问题)

c++ - 转换宏参数名称以用作 C++ 中的函数