Die*_*4DD 1 c embedded pic itoa mplab
在使用 PIC24FJ128GB204 的 MPLAB X 中学习嵌入式 C。
到目前为止,我主要听说在嵌入式设备上应该尽可能多地使用无符号类型(尤其是?),所以我开始使用 uint8_t 数组来保存字符串。但是,如果我从 stdlib.h 调用 itoa,它需要一个指向有符号字符 (int8_t) 数组的指针:
extern char * itoa(char * buf, int val, int base);
当我在无符号数组上使用 itoa 后尝试编译时,这一点特别清楚:
main.c:317:9: warning: pointer targets in passing argument 1 of 'itoa' differ in signedness
c:\program files (x86)\microchip\xc16\v1.36\bin\bin\../..\include/stdlib.h:131:15: note: expected 'char *' but argument is of type 'unsigned char *'
Run Code Online (Sandbox Code Playgroud)
在其他平台上搜索 itoa 的实现,这似乎是常见的情况。
这是为什么?
(我还注意到大多数实现都需要值/指针/基数,而出于某种原因,来自 Microchip 的 stdlib.h 首先需要指针。我花了一段时间才意识到这一点。)
char作为签名或未签名是几十年前的妥协 - 当时为当时的编译器带来一定程度的一致性是有道理的。
itoa(),虽然不是标准的 C 库函数,但遵循该约定,因为字符串由char.
许多库函数使用字符串指针。 itoa()也是如此,并将内部工作处理为unsigned char. 请记住,字符串是表示text,而不是数字 - 因此char本身的符号性不是一个大问题。当然重点itoa()是取一个数字( int)并形成一个字符串。
在许多情况下,C 库在char 功能上“好像”对待它unsigned char。
int fgetc()返回范围内的EOF或unsigned char范围内的值。
printf() "%c":“int参数被转换为一个unsigned char,并写入结果字符。”
<string.h>“对于本子条款中的所有函数,每个字符都应该被解释为好像它具有类型unsigned char(因此每个可能的对象表示都是有效的并且具有不同的值)。”
<ctype.h>“在所有情况下,参数都是 an int,其值应表示为 anunsigned char或应等于宏的值EOF。