2

我有一个实现对 EEPROM 的写入操作的 API。这是它的声明:

CYBLE_API_RESULT_T CyBle_StoreAppData (uint8 * srcBuff, const uint8 destAddr[], uint32 buffLen, uint8 isForceWrite);

当我调用此函数并向srcBuff其发送已声明为uint8类型的数组参数时,它运行良好。

问题是,我需要向char它发送数组指针。我在想这char已经是一个uint8,但是如果我char向该函数发送一个数组指针而不是uint8. 为什么我不能使用char而不是uint8?以下是调用该函数的 2 个示例:

static const uint8      datastack_ROM[dedicatedRomSize] = {0};
uint8                   Container_ID[10];
char                    Prefix[10];

//Call the function with Container_ID which has been declared as uint8. This is working.
CyBle_StoreAppData(Container_ID,datastack_ROM,10,0);

//Call the function with Prefix which has been declared as char. This is NOT working.
CyBle_StoreAppData(Prefix,datastack_ROM,10,0);

这是第二次调用的警告:

passing char[10] to parameter of type 'uint8 *' converts between pointers to integer types with different sign.

不是charuint8一样吗?

4

4 回答 4

2

char并且uint8两者都有共同点,这很重要:它们都是 8 位整数。现在有两个问题

  • 是/这是/这些8位整数有符号还是无符号?

更重要的是

  • 你的情况有关系吗?

即你想向函数发送一个由整数组成的数组,重要的是让它们被认为是有符号的?例如,如果函数会做类似的事情,

if (charvalue < 0) { ... 

或者如果希望函数注意字节的符号(如果可能的话);如果函数会这样做,并且符号很重要:发送 a255是肯定的,但考虑到已签名的字节,那将被解释为-1......

但这没有意义,因为函数需要uint8 *(实际上在函数内部,开发人员可能曾经用来char单独处理字节,并使用它们的符号,但在这种情况下,具有这样的函数签名会非常误导!)

所以 E 2 PROM 正在处理无符号字节,您可以安全地将给定函数的指针转换为删除警告,

CyBle_StoreAppData((uint8 *)Prefix,datastack_ROM,10,0);

或者干脆

uint8  Prefix[10];

如果这不会导致您的其余代码出现其他问题/警告。

于 2016-02-08T08:46:17.320 回答
2

两种类型都是 8 位长。不同之处在于签名。

  • uint8类型是无符号的。
  • char类型应在您的情况下签名。实际上,它依赖于编译器,但大多数编译器char默认认为该类型是有符号的,并且如果需要,可以选择强制char类型为无符号。请参阅C99 标准文档参考§6.2.5p15:

实现应将 char 定义为与有符号字符或无符号字符具有相同的范围、表示和行为。

在limits.h 中定义的CHAR_MIN 将具有值0 或SCHAR_MIN 之一,这可用于区分这两个选项。

于 2016-02-08T08:15:50.467 回答
1
uint8                   Container_ID[10];

那是一个无符号的 8 位整数,可能的值从0255

char                    Prefix[10];

在您的情况下,一个带符号的 8 位字符,其整数值从-127+128

因为它们不是相同的标志类型,所以您应该会收到转换警告。

于 2016-02-08T08:17:45.030 回答
0

uint8_t很可能被定义为无符号字符。

char它是自己的类型,其行为与signed char 或unsigned char 完全相同(注意,这是三种不同的类型)。

在这种情况下,它的行为类似于签名字符,并且您会收到转换警告。

于 2016-02-08T08:14:51.643 回答