int8_t 和 char:在指针之间转换为具有不同符号的整数类型 - 但它不会

int8_t and char: converts between pointers to integer types with different sign - but it doesn't

本文关键字:符号 整数 类型 char 转换 之间 指针 int8      更新时间:2023-10-16

我正在使用一些嵌入式代码,我正在从头开始编写一些新的东西,所以我更喜欢坚持使用uint8_t, int8_t等类型。

但是,当移植函数时:

void functionName(char *data)

:

void functionName(int8_t *data)

当传递一个字面值字符串给函数时,我得到编译器警告"在指针之间转换为具有不同符号的整数类型"。(即调用functionName("put this text in");时)。

现在,我明白为什么会发生这种情况,这些行只是调试,但是我想知道人们觉得什么是最合适的处理方式,除了对每个字面值字符串进行类型转换。我不觉得在实践中,毯式类型转换比使用像"char"这样可能有歧义的类型更安全。

你好像做错了。

字符没有被C定义为8位整数,所以为什么你会选择使用int8_tuint8_t来表示字符数据,除非你正在使用UTF-8?

对于C的字符串字面值,它们的类型是指向char的指针,并且根本不能保证是8位的。

如果是signedunsigned则没有定义,因此只需使用const char *作为字符串字量

回答您的附录(原始问题已由@unwind很好地回答)。我认为这主要取决于语境。如果你正在处理文本,即字符串字面值,你必须使用const char*char*,因为编译器会相应地转换字符。如果不编写自己的字符串实现,您可能只能使用编译器提供给您的任何东西。然而,当你必须与CPU上下文之外的人/事物进行交互时,例如网络,串行等,你必须控制确切的大小(我想这就是你的问题的根源)。在这种情况下,我建议编写函数将字符串或任何数据类型转换为uint8_t缓冲区,以便序列化发送(或接收)。

const char* my_string = "foo bar!";
uint8_t buffer* = string2sendbuffer(my_string);
my_send(buffer, destination);

string2buffer函数将知道有关将字符放入缓冲区的所有信息。例如,它可能知道您必须使用大端字节排序将每个char编码为两个缓冲区元素。这个函数肯定是平台相关的,但它封装了所有这些平台相关,因此您将获得很大的灵活性。对于其他复杂数据类型也是如此。对于其他一切(编译器没有那么强的意见),我建议使用stdint.h提供的(u)intX_t类型(应该是可移植的)。

类型char是有符号的还是无符号的是由实现定义的。看起来您使用的环境是unsigned

所以,你可以使用uint8_t或坚持使用char,每当你处理字符