У меня есть две сборки для части программного обеспечения, которую я разрабатываю, одна для встроенной системы, где размер int равен 16 битам, а другая для тестирования на настольном компьютере, где размер int равен 32 битам. Я использую целочисленные типы фиксированной ширины из <stdint.h>
, но правила целочисленного продвижения по-прежнему зависят от размера int.
В идеале я хотел бы, чтобы следующий код печатал 65281
(целочисленное повышение до 16 бит) вместо 4294967041
(целочисленное повышение до 32 бит) из-за целочисленного повышения, чтобы оно точно соответствовало поведению во встроенной системе. Я хочу быть уверен, что код, который дает один ответ во время тестирования на моем рабочем столе, дает точно такой же ответ во встроенной системе. Решение для GCC или Clang было бы хорошо.
#include <stdio.h>
#include <stdint.h>
int main(void){
uint8_t a = 0;
uint8_t b = -1;
printf("%u\n", a - b);
return 0;
}
РЕДАКТИРОВАТЬ:
Пример, который я привел, возможно, не был лучшим примером, но я действительно хочу, чтобы целочисленное продвижение было до 16 бит вместо 32 бит. Возьмите следующий пример:
#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>
int main(void){
uint16_t a = 0;
uint16_t b = 1;
uint16_t c = a - 2; // "-2": 65534
uint16_t d = (a - b) / (a - c);
printf("%" PRIu16 "\n", d);
return 0;
}
Выходные данные равны 0
в 32-разрядной системе из-за усечения от целочисленного деления после перехода к (подписанному) целому числу, в отличие от 32767
.
Лучшим ответом на данный момент, похоже, является использование эмулятора, а это не то, на что я надеялся, но, думаю, имеет смысл. Похоже, что для компилятора теоретически должно быть возможно сгенерировать код, который ведет себя так, как будто размер int равен 16 битам, но я думаю, что, возможно, не должно быть слишком удивительно, что на практике нет простого способа сделать это, и, вероятно, нет особого спроса на такой режим и какой-либо необходимой поддержки во время выполнения.