gpt4 book ai didi

c - C 中的可移植 BIT 宏

转载 作者:太空宇宙 更新时间:2023-11-04 01:21:42 25 4
gpt4 key购买 nike

我有一个裸机 SW 环境,可以在多种架构上编译运行,例如 ARM 32-bit v7/ARM 64-bit v8 和自定义 in-房屋建筑:我们称它为 ARCHX:

首先是如何在ARM32ARM64ARCHX 上定义不同的数据类型:

(注意:本例中ARM64使用LP64编程模型)。

  • ARM32/ARM64/ARCHX
    • 整数:32/32/16
    • 长:32/64/32
    • 指针:32/64/16

我已经实现了一个 BIT 宏:

#define BIT(n) (0x1U << (n))

现在在 ARCHX 上,如果对 int(ARCHX 中的 16 位)使用 BIT,则会出现错误:

Warning: shiftcount too large, result is undefined

现在将 UL 添加到此宏可以解决该问题,但通常可能会导致其他架构出现问题。

所以我的问题是:

BIT 宏的定义是否不能在架构和编译器之间移植,因为我需要在某些架构上使用 UL,在某些架构上使用 U甚至可能在某些组合上使用 ULL(ARM64LLP 编程模型?)。

也许 BIT 宏应该重命名并分为 BIT16, BIT32 & BIT64 并分别实现体系结构而不是通用的 BIT - 用于所有体系结构的宏?

最佳答案

首先,绝对没有理由使用这些宏来隐藏非常基本的功能。 x |= 1U << n;比晦涩难懂的x |= BIT(n);清晰多了.始终假设阅读您的代码的人知道 C 语言,但不知道您的 secret 宏语言。

因此,您应该做的第一件事就是摆脱宏。


也就是说,可移植性是通过使用 stdint.h 中的类型实现的.

uint32_t x = (uint32_t)1U << n;

完全可以移植到任何已知的计算机上。

同样,您也可以使用标准 UINTn_C文字格式和类型

uint32_t x = UINT32_C(1) << n;

关于c - C 中的可移植 BIT 宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41018680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com