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

时间:2014-06-03 10:34:33

标签: c++ c char embedded

我正在处理一些嵌入式代码,我正在从头开始编写新内容,因此我更倾向于坚持使用uint8_t,int8_t等类型。

但是,在移植函数时:

void functionName(char *data)

到:

void functionName(int8_t *data)

我得到编译器警告"指针转换为具有不同符号的整数类型"将文字字符串传递给函数时。 (即在致电functionName("put this text in");时)。

现在,我理解为什么会发生这种情况并且这些行只是调试但是我想知道人们认为最合适的处理方法是什么,而不是对每个字符串进行类型转换。我觉得在实践中比使用像#" char"这样可能含糊不清的类型更安全的毯子类型转换。

3 个答案:

答案 0 :(得分:3)

你似乎在做错事,在这里。

C不将字符定义为8位整数,那么为什么要选择使用int8_tuint8_t来表示字符数据,除非您使用的是UTF-8? / p>

对于C&C的字符串文字,它们的类型是指向char的指针,而且根本不保证为8位。

如果它是signedunsigned,它也没有被定义,所以只需使用const char *来表示字符串文字。

答案 1 :(得分:3)

回答你的附录(@unwind很好地回答了原来的问题)。我认为这主要取决于背景。如果您正在处理文本,即字符串文字,则必须使用const char*char*,因为编译器会相应地转换字符。如果没有编写自己的字符串实现,您可能会遇到编译器为您提供的任何内容。但是,您必须与CPU上下文之外的某人/某事进行交互,例如网络,连续等,你必须控制确切的大小(我想这是你的问题源自哪里)。在这种情况下,我建议编写函数来将字符串或任何数据类型转换为uint8_t缓冲区以进行序列化发送(或接收)。

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

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

答案 2 :(得分:1)

类型char是签名还是未签名是实现定义的。看起来您正在使用未签名的环境。

因此,无论何时处理字符,都可以使用uint8_t或坚持使用char