使用C语言存储字符时,使用普通的char还是signed/unsigned char有区别吗?
是的,当字符对象为有符号字符且为负值时与无符号字符相同的位模式为正值时,使用>>,*,/,%会产生差异。
将负字符分配给int可能会出现意外的符号扩展。
is...()在字符参数为负数(非EOF)时会调用未定义行为(UB)。
_Generic中的情况区分char、signed char和unsigned char。
严格:使用旧式的非2'S补码并使用带符号字符时,用户代码经常无法正确区分空字符的+0和-0。
转换为其他类型时,有符号类型比无符号类型具有更多的实现定义行为,因此降低了可移植性。
"signed char在处理UTF-8编码文本方面存在劣势。
...还有其他问题。
...并非总是如此
str...()
的行为就好像字符是unsigned char
,而不管char
是signed还是unsigned。这对于某些函数很重要,例如strcmp()
,因为一个字符串中的差异涉及到负的char
的情况。
"%c","%s"
在 *scanf(),*printf()
中匹配所有3种类型(或指向它们的指针)。
三个字符类型没有填充位,并且占用相同的空间,尽管即将被取消的非2的补码编码允许有一个陷阱表示为signed字符类型。
“我可以使用char、signed char或unsigned char来存储字符吗?”
可以。
对于字符串操作,char在匹配str..()函数签名方面具有优势。
对于逻辑和原始字节码,请使用unsigned char。
当需要小的有符号值时,请使用signed char。
@Steve Summit, @Support Ukraine
如果答案是“不行”,我的下一个问题将是:为什么?你能解释一下使用严格字符(普通字符)存储字符的原因吗?
char
,因为大多数C的字符串相关函数都是定义为使用char
或char *
。如果您正在使用原始字节,特别是如果您正在进行一些数学运算以将相邻的字节组合成多字节整数,则通常非常有用将所有内容声明为unsigned char
或unsigned char *
,因为您可以避免许多与符号扩展有关的烦人问题。 - Steve Summitchar
表示字符和字符串。使用unsigned char
表示低级别的原始数据。特别是在使用位运算符时,应该使用unsigned char
。在需要对小型数据类型进行有符号计算的(很少见的)情况下,使用signed char
。 - Support Ukraine