Сначала вам нужно сделать расширение знака на ваших 18 битах, чтобы заполнить нативное int
:
const int negative = (smallInt & (1 << 17)) != 0;
int nativeInt;
if (negative)
nativeInt = smallInt | ~((1 << 18) - 1);
else
nativeInt = smallInt;
Если число считается отрицательным (т. Е. Установлен бит 17), мы побитуем - или это с битовой комбинацией, которая имеет единицы во всех оставшихся битах. Это создает правильное отрицательное целое число нативного размера.
Затем просто выведите собственное целое число как обычно, поскольку вы говорите так, как будто вам нужно десятичное строковое представление:
char buf[12];
snprintf(buf, sizeof buf, "%d", nativeInt);
Конечно, эта последняя часть может не соответствовать вашим ожиданиям; это не возможно "самый быстрый". Поскольку у вас ограниченный входной диапазон 18 бит, возможно, можно придумать что-то более оптимизированное.
Несколько идей:
- Удалите аргумент размера буфера (т.е. используйте
sprintf()
), так как мы можем быть совершенно уверены в максимальном количестве необходимых символов.
- Поскольку мы знаем диапазон, используйте что-то менее общее, которое никогда не проверяет значения вне диапазона.
- Используйте
itoa()
, если оно у вас есть, менее общее, чем s*printf()
, поэтому может быть быстрее.