Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 铸造国际16吨至国际8吨*_C++_Arduino_Int_Uint8t_Uint16 - Fatal编程技术网

C++ 铸造国际16吨至国际8吨*

C++ 铸造国际16吨至国际8吨*,c++,arduino,int,uint8t,uint16,C++,Arduino,Int,Uint8t,Uint16,我有一个库驱动的结果存储为int16_t值(它是负数,我可以使用的绝对值)和另一个库函数,该函数在几步后以uin8_t*的形式需要该值。如何在不使用字符串的情况下做到这一点 下面的代码可以工作,但使用了可怕的字符串。有没有一种不用调用String或std::String的方法来实现这一点 void setup() { Serial.begin(9600); } void loop() { delay(5000); String initia

我有一个库驱动的结果存储为int16_t值(它是负数,我可以使用的绝对值)和另一个库函数,该函数在几步后以uin8_t*的形式需要该值。如何在不使用字符串的情况下做到这一点

下面的代码可以工作,但使用了可怕的字符串。有没有一种不用调用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\u t转换为uint8\u t*

下面的评论指出:
Serial.println(static_cast(*finalVal))
可以工作,但此解决方案将uint8\u t转换为无符号int,并且该方法需要uint8\u t*


我来自Java之类的语言,把整数转换成字符串太难了,这似乎很疯狂。

类型为uint8\u t的指针不能指向类型为
int16\u t
的对象;您需要复制
firstVal
的值,但因此需要一个单独的对象来获取该值

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

注意:
uint8\u t x=-34
不会给出
-34
的绝对值,即不会产生
34
。您将得到一个2的补码
-34
,即
255-34+1==222
int16\t
使用16位(-32768到32767)存储有符号的数值

uint8\t
使用8位(0到255)存储无符号数值

如果您确定更改符号后,您的
int16\u t
值符合
uint8\u t
,则只需分配它:

int16_t firstVal = -76;
uint8_t secondVal = -firstVal;
现在,如果需要指向第二个值的指针,可以创建它。您不能直接指向
firstVal
,因为您需要存储更改后的值

uint8_t* secondValPointer = &secondVal;
uint8\u t*
可以解释为指向库中字符的指针。通常情况下,您应该使用char(也是8位,但是)。您可以将此指针强制转换为c
har*
,但需要使用reinterpret\u cast告诉编译器您要在指针之间强制转换:

char *secondValAsChar = reinterpret_cast<char*>(secondValPointer);
char*secondValAsChar=reinterpret\u cast(secondValPointer);
现在,您可以将此指针视为指向字符的指针。例如,以下代码将打印“L”,因为L的ASCII代码为76:

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

std::cout这很奇怪,但如果理解正确-您希望将
firstVal
的绝对值设置为
secondVal
,而不考虑其符号(并且-假设您将16位整数转换为8位-可能会丢失数据)?是的。数字始终小于120,因此不会丢失保真度。您正在尝试将指针设置为-76。这真的是你想要的吗。您希望在那里找到什么?我正在寻找指向字母数字字符-76的指针,而不是整数值。这是一个无线电信号作为健康检查返回给发送者的强度。这听起来更像。具体点:什么库,哪种方法。这是一个很好的开始,但现在数值被转换成字母(例如76被转换成“L”),奇怪的是,有一个字符串从先前标记为“buf”的变量连接而来。如果您有
uint8\u t*secondVal,结果将“-76”转换为“LHello World!”Serial.println(static_cast(*finalVal))现在输出正确的数字。对不起,我必须重新打开此文件
static\u cast
将其转换为无符号int,并且它不再被要求uint8\u t*作为传递变量的方法接受。转换为无符号的
unsigned
仅用于打印目的。如果函数需要一个
uint8*
你应该给它
finalVal
。对于我的输出,我使用Serial.print()。如果我在其他uint8_t*整数值上使用它,它将输出数值,而不是八位字节表示的ASCII字符。我必须使用uint8_t*而不是char*,因为库函数需要它。我为一个可编译的示例编辑了代码。