ฉันกำลังเขียนแอปพลิเคชันใน 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]
เตือนอ่านสิ่งที่ชอบ ปัญหาที่จะกล่าวถึงที่นี่และที่นี่
มันไม่ได้เกิดขึ้นเมื่อใช้ตัวแปรประกาศเป็นหรือ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
และกลับ สิ่งนี้นำไปสู่คำถามที่ใหญ่กว่า:
- ฉันสามารถป้องกันคำเตือนของคอมไพเลอร์โดยใช้ typecasting (เช่น
value16 = (uint16_t)(value16 << 8);
) ฉันเพิ่งซ่อนปัญหาหรือไม่ มีวิธีที่ดีกว่าที่จะไปเกี่ยวกับเรื่องนี้?
value8 += 2u;
และvalue8 = value8 + 2u;
แต่ฉันได้รับคำเตือนเดียวกัน
8u
2u