我正在使用 gcc 在 c 中为 STM32F105 编写应用程序。
在过去(对于更简单的项目),我总是将变量定义为char
、int
、unsigned int
等。
我发现使用 stdint.h 中定义的类型很常见,例如int8_t
, uint8_t
,uint32_t
等。这在我使用的多个 API 以及 ST 的 ARM CMSIS 库中都是如此。
我相信我理解我们为什么要这样做;让编译器更好地优化内存空间。我预计可能还有其他原因。
但是,由于 c 的整数提升规则,每当我尝试添加两个值、进行按位运算等时,我都会遇到转换警告。警告内容类似于conversion to 'uint16_t' from 'int' may alter its value [-Wconversion]
. 这个问题在这里和这里讨论。
int
使用声明为or的变量时不会发生这种情况unsigned int
。
举几个例子,鉴于此:
uint16_t value16;
uint8_t value8;
我将不得不改变这一点:
value16 <<= 8;
value8 += 2;
对此:
value16 = (uint16_t)(value16 << 8);
value8 = (uint8_t)(value8 + 2);
这很丑陋,但如果有必要我可以这样做。以下是我的问题:
是否存在从无符号到有符号再回到无符号的转换会使结果不正确的情况?
是否有任何其他重要原因支持/反对使用 stdint.h 整数类型?
根据我收到的答案,看起来通常首选 stdint.h 类型,即使 c 转换uint
为int
和返回。这就引出了一个更大的问题:
value16 = (uint16_t)(value16 << 8);
我可以通过使用类型转换(例如)来防止编译器警告。我只是在隐藏问题吗?有没有更好的方法来解决它?