我正在构建一个类,它接受一个十六进制值数组,将它们存储在私有(private)属性中,然后将
#include <iostream>
class RFIDData {
public:
static const uint8_t idLength = 10;
private:
int idArray[idLength] = {0};
uint8_t currentIndex = 0;
public:
void addIdElement(char element) {
this->idArray[this->currentIndex] = element;
this->currentIndex++;
}
void printArray() {
for (uint8_t i = 0 ; i < idLength; i ++){
std::cout << std::hex << this->idArray[i];
}
std::cout << std::endl;
}
};
int idArray[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11};
int main(int argc, const char * argv[]) {
RFIDData rfid;
for (uint8_t i = 0; i < 8; i++){
rfid.addIdElement(idArray[i]);
}
rfid.printArray();
}
我遇到的问题是,当我单步执行代码并查看添加到数组中的私有(private)属性值时,数字存储在 F 中,而不是数字中无关紧要的 0,而我不知道为什么。
例如十六进制值 0xaa
被存储为 0xffffffaa
。
我对 C++ 很陌生,并且正在尝试学习它。我确定这是我误解的东西,只是在寻找正确方向的一点。
最佳答案
char
是有符号的还是无符号的取决于你的平台和工具链,但它通常是有符号的。使用表达式 0xAA 初始化的带符号 char
,将 int
传递给 addIdElement
时会发生这种情况,其值为 -86(从技术上讲这不是保证,但它遵循常见的二进制补码实现和编译器不想做不必要的工作)。
将此值转换回 32 位 int
(idArray
) 会尝试保持值 -86,结果为 0xFFFFFFAA。这是 sign extension .
您可能希望专门存储 unsigned char
,以便您的值和转换都明确符合您的意图。在下面的示例中,我将其提取到名为 IdType
的自己的类型别名中,以确保整个代码的一致性:
#include <iostream>
class RFIDData {
public:
using IdType = uint8_t;
static const IdType idLength = 10;
private:
IdType idArray[idLength] = {0};
IdType currentIndex = 0;
public:
void addIdElement(const RFIDData::IdType element) {
this->idArray[this->currentIndex] = element;
this->currentIndex++;
}
void printArray() {
for (IdType i = 0 ; i < idLength; i ++){
std::cout << std::hex << (unsigned int)this->idArray[i];
}
std::cout << std::endl;
}
};
RFIDData::IdType idArray[] = {0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff, 0x00, 0x11};
int main(int argc, const char * argv[]) {
RFIDData rfid;
for (size_t i = 0; i < 8; i++){
rfid.addIdElement(idArray[i]);
}
rfid.printArray();
}
// Output: aabbccddeeff01100
( live demo )
请注意,在将 ID 值插入 std::cout
时,我还必须应用转换,因为 uint8_t
通常是 unsigned char
并且标准库的 IOStreams 部分对这些进行了特殊处理(或者更确切地说,它们不通过将您的数字按词法转换为它们的 ASCII 表示来对它们进行特殊处理)。
关于C++ 似乎将我的十六进制无关紧要的零变成了 Fs,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54725084/