Приведение int16_t к uint_8t *

У меня есть результат, управляемый библиотекой, который хранится в виде значения int16_t (и оно является отрицательным, и я могу использовать его как абсолютное значение), а также другую библиотечную функцию, которая требует это значение несколькими шагами позже в форме uin8_t *. Как это можно сделать без использования String?

Следующий код работает, но использует страшные строки. Есть ли способ сделать это без вызова String или std :: string?

 void setup() {
Serial.begin(9600);
}

void loop() {
delay(5000);
String initialVal= String(-fetchInt());
Serial.print("Initial value is: ");Serial.println(initialVal);//prints "76"uint8_t medianVal[sizeof(initialVal);
medianVal.getBytes(medianVal, sizeof(initialVal));
Serial.print("median value is: ");Serial.println(medianVal);//prints "76"uint8_t* finalVal = medianVal;
Serial.print("final value is: ");Serial.println((char*)finalVal);//prints "76"}

int16_t fetchInt(){
return -76;
}

Итак, как я могу повернуть int16_t в uint8_t *?

В комментариях ниже указано, что
Serial.println(static_cast<unsigned>(*finalVal)); работает, но это решение преобразует uint8_t в unsigned int, и метод требует uint8_t *.

Я пришел из Java и тому подобное, и кажется сумасшедшим, что так трудно преобразовать целое число в строку.

3

Решение

Указатель типа uint8_t не может указывать на объект типа int16_t; вам нужно скопировать значение firstVal, но поэтому вам понадобится отдельный объект, чтобы принять значение.

uint8_t firstValAbs = firstVal >= 0 ? firstVal : -firstVal;
uint8_t* secondVal = &firstValAbs;

Замечания: uint8_t x = -34 будут не дать вам абсолютное значение -34то есть это не приведет к 34, Вы скорее получите два дополнения -34т.е. 255-34+1 == 222,

5

Другие решения

int16_t хранит числовое значение со знаком, используя 16 бит (от -32 768 до 32 767).

uint8_t сохраняет числовое значение без знака, используя 8 бит (от 0 до 255).

Если вы уверены, что ваш int16_t значение вписывается в uint8_t после изменения знака вы можете просто назначить его:

int16_t firstVal = -76;
uint8_t secondVal = -firstVal;

Теперь, если вам нужен указатель на второе значение, вы можете просто создать его. Вы не можете указать прямо на firstVal потому что вам нужно сохранить измененное значение.

uint8_t* secondValPointer = &secondVal;

это uint8_t* может интерпретироваться как указатель на символ в вашей библиотеке. Обычно для этой цели следует использовать символ (также 8 бит, но это реализация, определенная, если она подписана или не подписана). Вы можете привести этот указатель кhar*, хотя вам нужно указать компилятору, что вы хотите привести между указателями, используя reinterpret_cast:

char *secondValAsChar = reinterpret_cast<char*>(secondValPointer);

Теперь вы можете рассматривать этот указатель как указатель на символ. Например, следующий код напечатает «L», потому что ASCII-код для L равен 76:

std::cout << *secondValAsChar << std::endl;

Однако вы должны быть очень осторожны с этим указателем, поскольку secondValAsChar не является строкой с нулевым символом в конце, поэтому вы не можете использовать старые распространенные методы, такие как strcat,

3

По вопросам рекламы [email protected]