我正在使用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
或的变量时不会发生这种情况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);
)来防止编译器警告。我只是隐藏问题了吗?有更好的方法吗?
value8 += 2u;
和value8 = value8 + 2u;
,但得到了相同的警告。
8u
和2u
。