虽然在您的代码中放置大量强制转换可能很乏味,但对我来说,使用尽可能强的类型实际上闻起来非常好。
如上所述,当您指定类型“char”时,您是在邀请编译器选择编译器编写者喜欢的任何内容(有符号或无符号)。我不是 UTF-8 方面的专家,但如果你不需要,没有理由让你的代码不可移植。
至于您的常量,我使用了默认常量以这种方式写入有符号整数的编译器,以及考虑上下文并相应地解释它们的编译器。请注意,有符号和无符号之间的转换可能会溢出。对于相同的位数,负数会溢出无符号数(显然),并且设置了最高位的无符号数会溢出有符号数,因为最高位表示负数。
在这种情况下,您的编译器将您的常量视为无符号 8 位 - 或更大 - 这意味着它们不适合作为有符号 8 位。我们都感谢编译器抱怨(至少我是)。
我的观点是,通过选角来准确展示你打算发生的事情并没有什么不好。如果编译器允许您在有符号和无符号之间进行分配,它应该要求您强制转换,而不考虑变量或常量。例如
常量 int8_t a = (int8_t) 0xFF; // 将是 -1
尽管在我的示例中,最好分配-1。当您必须添加额外的强制转换时,它们要么有意义,要么您应该对常量进行编码,以便它们对您分配的类型有意义。