将 int16_t 转换为 uint_8t*

Casting int16_t to 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 之类的地方,将整数转换为字符串如此困难,这似乎很疯狂。

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.

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* 可能被解释为指向您库中字符的指针。通常,您应该为此目的使用 char(也是 8 位,但 it is implementation defined if it is signed or unsigned)。您可以将此指针转换为 char*,但您需要告诉编译器您要使用 reinterpret_cast:

在指针之间进行转换
char *secondValAsChar = reinterpret_cast<char*>(secondValPointer);

现在,您可以将此指针视为指向字符的指针。例如下面的代码将打印 'L' 因为 L 的 ASCII 码是 76:

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

但是,你必须非常小心这个指针,因为 secondValAsChar 不是空终止字符串,所以你不能使用像 strcat.

这样的旧的常用方法