ฉันกำลังเขียนแอปพลิเคชันใน c สำหรับ STM32F105 โดยใช้ gcc
ในอดีตที่ผ่านมา (กับโครงการง่าย) ผมได้กำหนดไว้เสมอเป็นตัวแปรchar, int, unsigned intและอื่น ๆ
ผมเห็นว่ามันเป็นเรื่องธรรมดาที่จะใช้ประเภทที่กำหนดไว้ใน stdint.h เช่นint8_t, uint8_t, uint32_tฯลฯ นี้มันเป็นจริงในหลาย API ที่ฉันใช้และยังอยู่ในห้องสมุด ARM CMSIS จาก ST
ฉันเชื่อว่าฉันเข้าใจว่าทำไมเราควรทำเช่นนั้น เพื่อให้คอมไพเลอร์เพิ่มประสิทธิภาพพื้นที่หน่วยความจำให้ดีขึ้น ฉันคาดว่าอาจมีเหตุผลเพิ่มเติม
แต่เนื่องจากกฎการส่งเสริมจำนวนเต็มคผมให้ทำงานขึ้นกับคำเตือนการแปลงเวลาใด ๆ ที่ฉันพยายามที่จะเพิ่มค่าสองค่าดำเนินการค่าที่เหมาะสม ฯลฯ conversion to 'uint16_t' from 'int' may alter its value [-Wconversion]เตือนอ่านสิ่งที่ชอบ ปัญหาที่จะกล่าวถึงที่นี่และที่นี่
มันไม่ได้เกิดขึ้นเมื่อใช้ตัวแปรประกาศเป็นหรือintunsigned 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และกลับ สิ่งนี้นำไปสู่คำถามที่ใหญ่กว่า:
- ฉันสามารถป้องกันคำเตือนของคอมไพเลอร์โดยใช้ typecasting (เช่นvalue16 = (uint16_t)(value16 << 8);) ฉันเพิ่งซ่อนปัญหาหรือไม่ มีวิธีที่ดีกว่าที่จะไปเกี่ยวกับเรื่องนี้?
value8 += 2u;และvalue8 = value8 + 2u;แต่ฉันได้รับคำเตือนเดียวกัน
                
8u2u