int8_t 和 char:在指针之间转换为具有不同符号的整数类型 - 但它不会
int8_t and char: converts between pointers to integer types with different sign - but it doesn't
我正在使用一些嵌入式代码,我正在从头开始编写一些新的东西,所以我更喜欢坚持使用uint8_t, int8_t等类型。
但是,当移植函数时:
void functionName(char *data)
:
void functionName(int8_t *data)
当传递一个字面值字符串给函数时,我得到编译器警告"在指针之间转换为具有不同符号的整数类型"。(即调用functionName("put this text in");
时)。
现在,我明白为什么会发生这种情况,这些行只是调试,但是我想知道人们觉得什么是最合适的处理方式,除了对每个字面值字符串进行类型转换。我不觉得在实践中,毯式类型转换比使用像"char"这样可能有歧义的类型更安全。
你好像做错了。
字符没有被C定义为8位整数,所以为什么你会选择使用int8_t
或uint8_t
来表示字符数据,除非你正在使用UTF-8?
对于C的字符串字面值,它们的类型是指向char
的指针,并且根本不能保证是8位的。
如果是signed
或unsigned
则没有定义,因此只需使用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
,每当你处理字符
- 检查TCHAR数组输入是否为带符号整数C++
- 如何打印boost多精度128位无符号整数
- C++模板函数,用于比较任何无符号整数和有符号整数
- 为什么乘以常量有符号整数分数没有优化?
- 在线程中读取无符号整数时,c++ 位是否以原子方式切换?
- FlatBuffers/Protobuf 中是否有支持任意 24 位有符号整数定义的可移植二进制序列化架构?
- C++11 标准是否保证零值有符号整数的一元减号为零?
- Constexpr 可变参数模板,用于对无符号整数进行重新排序
- 为什么 Clang 和 GCC 中两个无符号整数之和的结果类型不同
- 为什么对无符号字符进行算术运算会将它们提升为有符号整数
- 从 std::string 转换为 const 无符号整数
- 迭代器和无符号整数的重载 + 运算符
- C++,概念不适用于无符号整数作为结果类型?
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 原子式清除无符号整数的最低非零位
- 什么是 16 字节有符号整数数据类型?
- 计算机使用什么方法添加无符号整数
- 运行时错误:有符号整数溢出:964632435 * 10 无法在类型 'int' 中表示
- boost::任何带有结构体和无符号整数
- 添加有符号和无符号整数