7
对于嵌入式代码,为什么我应该使用“ uint_t”类型而不是“ unsigned int”类型?
我正在使用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);)来防止编译器警告。我只是隐藏问题了吗?有更好的方法吗?