我有一个API实现对EEPROM的写操作。这是它的声明:
CYBLE_API_RESULT_T CyBle_StoreAppData (uint8 * srcBuff, const uint8 destAddr[], uint32 buffLen, uint8 isForceWrite);
当我调用此函数并将数组参数发送到已声明为srcBuff
类型的uint8
时,它运行良好。
问题是,我需要向它发送char
数组指针。我当时认为char
已经是uint8
,但如果我向该函数发送char
数组指针而不是uint8
,我会收到编译器警告。为什么我不能使用char
代替uint8
?以下是调用该函数的两个示例:
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.
Aren&#t; t char
和uint8
相同?
答案 0 :(得分:1)
两种类型都是8位长。不同之处在于签名。
char
类型未签名。char
类型应在您的案例中签名。实际上,它依赖于编译器,但大多数编译器将char
类型视为默认签名,并且如果需要,可以选择强制{{1}}类型为unsigned。请参阅C99 standard document reference§6.2.5p15:实现应将char定义为与signed char或unsigned char具有相同的范围,表示和行为。
在limits.h中定义的CHAR_MIN将具有值0或SCHAR_MIN之一,这可用于区分这两个选项。
答案 1 :(得分:1)
uint8 Container_ID[10];
这是一个无符号的8位整数,可能的值从0
到255
char Prefix[10];
在您的情况下,带有-127
到+128
的整数值的带符号8位字符
因为它们不是相同的符号类型,所以您应该得到转换警告。
答案 2 :(得分:1)
char
和uint8
都有一些共同之处,这很重要:它们都是8位整数。现在有两个问题
更重要的是
即。你想向函数发送一个由整数组成的数组,重要的是将它们视为已签名吗?例如,如果函数会执行类似的操作,
if (charvalue < 0) { ...
或你希望函数注意字节的符号(如果可能的话);如果函数会这样做,并且符号很重要:发送255
是正的,但考虑到签名的字节,那将被解释为-1
...
但这没有意义,因为该函数需要uint8 *
(实际上在devs可能已使用char
函数内部单独处理字节,并使用它们的签名,但在这种情况下有一个像这样的功能签名会产生误导!)
所以E 2 PROM处理无符号字节,你可以安全地转换给函数的指针来删除警告,
CyBle_StoreAppData((uint8 *)Prefix,datastack_ROM,10,0);
或只是
uint8 Prefix[10];
如果这不会导致其他代码出现其他问题/警告。
答案 3 :(得分:0)
uint8_t
很可能被定义为unsigned char。
char
是它自己的类型,其行为与signed char或unsigned char完全相同(注意,这些是三种不同的类型)。
在这种情况下,它的行为类似于signed char,并且您会收到转换警告。