Я пишу заявку в 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.