c - arm-none-eabi-gcc 中的 UINT16_C 定义错误?
问题描述
我注意到 arm-none-eabi-gcc 10.2UINTN_C
以下列方式定义宏(使用 编译-mcpu=cortex-m7 -std=c99 -g3 -O0
):
#define UINT32_C(x) __UINT32_C(x)
#define UINT16_C(x) __UINT16_C(x)
然后
#define __UINT32_C(c) c ## UL
#define __UINT16_C(c) c
C99 标准(7.18.4.1 p2)说:
宏 UINTN_C(value) 应扩展为具有指定值和类型 uint_leastN_t 的无符号整数常量。
32 位版本确实扩展为无符号 32 位表示(uint_least32_t
在unsigned long
此 CPU 上)。
然而,16 位版本扩展为有符号表示:UINT16_C(1)
扩展为1
类型为int
.
是不是和标准相矛盾?有没有可以解决这个问题的 gcc 选项?
为什么不做类似的事情#define __UINT16_C(c) ((uint_least16_t)(c))
?
解决方案
C 无法识别类型小于int
and的数字文字的概念unsigned int
。在int
32 位的平台上,由于整数提升,表达式(uint16_t)123
将表现为类型signed int
,并且包含假定类型的数字文字的表达式的uint16_t
行为方式与该类型将被处理。
推荐阅读
- javascript - 将输入值乘以其他输入
- android - 使用 NDK(本机 C++ 代码)部分构建 librealsense android 应用程序?
- arrays - 如何在保持函数中使用的变量值的同时正确调用我的函数?
- typescript - eslint 成员排序陷阱 - 先出现的声明会导致错误
- mysql - MySQL SELECT on 2 SELECT 结果是否可能
- c# - Blazor 将字符串发布到 API 获取 NULL
- java - 生产者和消费者没有按顺序打印答案
- python - pygame.draw.rect 和 screen_surface.blit() 有什么区别?
- c++ - 即使链表中只剩下一个节点,如何按值删除链表中的节点
- java - 使用多个列表保留所有值