Gcc kullanarak bir STM32F105 c için bir uygulama yazıyorum.
Geçmişte (daha basit projeler ile), ben her zaman olduğu gibi değişkenleri tanımladık char
, int
, unsigned int
, vb.
Bunun gibi stdint.h tanımlanan türde kullanımı yaygındır görüyoruz int8_t
, uint8_t
, uint32_t
vb Bu çoklu API en kullanıyorum olduğunu ve aynı zamanda ST gelen ARM CMSIS kütüphanede gerçek.
Bunu neden yapmamız gerektiğini anladığına inanıyorum; derleyicinin bellek alanını daha iyi optimize etmesine izin vermek için. Umarım ek sebepler olabilir.
Ancak, c'nin tamsayı promosyon kuralları nedeniyle, iki değer eklemeye çalıştığımda, bit yönünde işlem yaptığımda, dönüştürme uyarılarına karşı koşmaya devam ediyorum. Uyarı gibi bir şey okuyor conversion to 'uint16_t' from 'int' may alter its value [-Wconversion]
. Mesele burada ve burada tartışılmaktadır .
int
Veya olarak bildirilen değişkenleri kullanırken bu gerçekleşmez unsigned int
.
Birkaç örnek vermek gerekirse:
uint16_t value16;
uint8_t value8;
Bunu değiştirmek zorunda kalacağım:
value16 <<= 8;
value8 += 2;
buna:
value16 = (uint16_t)(value16 << 8);
value8 = (uint8_t)(value8 + 2);
Çirkin, ama gerekirse yapabilirim. İşte benim sorularım:
Dönüştürme bir vaka var mı imzasız için imzalanmış ve geri imzasız sonuç yanlış yapacak?
Stdint.h tamsayı türlerini kullanmanın / buna karşı başka büyük nedenler var mı?
Stdint.h türleri genellikle tercih edilir gibi alıyorum yanıtlara göre, hatta c dönüştürür olsa görünüyor uint
etmek int
ve arka. Bu daha büyük bir soruya yol açar:
- Derleyici uyarılarını typecasting (örn.
value16 = (uint16_t)(value16 << 8);
) Kullanarak önleyebilirim . Sadece sorunu gizliyor muyum? Bunun için daha iyi bir yol var mı?
value8 += 2u;
ve value8 = value8 + 2u;
aynı uyarıları alıyorum.
8u
ve2u
.