Saya menulis aplikasi dalam c untuk STM32F105, menggunakan gcc.
Di masa lalu (dengan proyek-proyek sederhana), saya selalu didefinisikan sebagai variabel char
, int
, unsigned int
, dan sebagainya.
Saya melihat bahwa itu adalah umum untuk menggunakan jenis didefinisikan dalam stdint.h, seperti int8_t
, uint8_t
, uint32_t
, dll Hal ini benar dalam beberapa API yang saya gunakan, dan juga di perpustakaan ARM CMSIS dari ST.
Saya percaya bahwa saya mengerti mengapa kita harus melakukannya; untuk memungkinkan kompiler mengoptimalkan ruang memori dengan lebih baik. Saya berharap mungkin ada alasan tambahan.
Namun, karena aturan promosi bilangan bulat c, saya terus berjalan melawan peringatan konversi setiap kali saya mencoba menambahkan dua nilai, melakukan operasi bitwise, dll. Peringatan itu berbunyi seperti conversion to 'uint16_t' from 'int' may alter its value [-Wconversion]
. Masalahnya dibahas di sini dan di sini .
Itu tidak terjadi ketika menggunakan variabel dinyatakan sebagai int
atau unsigned int
.
Untuk memberikan beberapa contoh, berikan ini:
uint16_t value16;
uint8_t value8;
Saya harus mengubah ini:
value16 <<= 8;
value8 += 2;
untuk ini:
value16 = (uint16_t)(value16 << 8);
value8 = (uint8_t)(value8 + 2);
Itu jelek, tapi aku bisa melakukannya jika perlu. Ini pertanyaan saya:
Apakah ada kasus di mana konversi dari tidak ditandatangani menjadi ditandatangani dan kembali ke tidak ditandatangani akan membuat hasilnya salah?
Apakah ada alasan besar lainnya untuk / menentang penggunaan tipe integer stdint.h?
Berdasarkan jawaban yang saya terima, sepertinya jenis stdint.h umumnya lebih disukai, meskipun c mengkonversi uint
ke int
dan kembali. Ini mengarah ke pertanyaan yang lebih besar:
- Saya bisa mencegah peringatan kompiler dengan menggunakan typecasting (mis
value16 = (uint16_t)(value16 << 8);
.). Apakah saya hanya menyembunyikan masalahnya? Apakah ada cara yang lebih baik untuk melakukannya?
value8 += 2u;
dan value8 = value8 + 2u;
, tetapi saya mendapatkan peringatan yang sama.
8u
dan2u
.