Я пишу заявку в c для STM32F105, використовуючи gcc.
У минулому (з більш простими проектами), я завжди визначаються змінні , як char
, int
, unsigned int
і так далі.
Я бачу , що він є загальним для використання типи , певні в stdint.h, такі як int8_t
, uint8_t
, uint32_t
і т.д. Це правда , що в багатокорпусних API, який я використовую, а також в бібліотеці ARM CMSIS від ST.
Я вважаю, що я розумію, чому ми повинні так робити; щоб дозволити компілятору краще оптимізувати простір пам'яті. Я думаю, що можуть бути додаткові причини.
Однак, через цілі правила просування 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
та назад. Це призводить до більшого питання:
- Я можу запобігти попередженням компілятора, використовуючи typecasting (наприклад,
value16 = (uint16_t)(value16 << 8);
). Чи я просто приховую проблему? Чи є кращий спосіб зробити це?
value8 += 2u;
і value8 = value8 + 2u;
, але отримую однакові попередження.
8u
і2u
.