在哪些情况下我们需要使用有符号的char呢?我猜唯一的用途可能是将char类型的数据转换成整数。
char
设置为有符号是因为在C语言早期,每个整数类型都是有符号的。当无符号类型被添加到语言中时,可能已经存在太多现有代码在char变量中存储-1作为哨兵值,因此不可行将现有系统上的编译器更改为char
是无符号的。也许没有任何关于无符号char的巨大压力;C语言的早期开发是在7位ASCII上进行的。char
设置为无符号,因为具有负值的可打印字符会比无法在char
中存储-1更大的可移植性问题更加困难。另一方面,这导致了当前的情况,即可移植代码不能对char的符号性做出任何假设。char
是一个整数,通常宽度为8位。但由于其符号性取决于实现(即取决于编译器),因此在算术运算中使用它可能不是一个好主意。相反,应该使用unsigned char
或signed char
,或者如果要强制指定宽度,则可以使用来自stdint.h
的uint8_t
和int8_t
。
uint8_t
会对宽度做出明确的假设,特别是如果存在,则暗示char
具有8位宽度。此外,如果那些批准这样的编辑的人(必须有两个人投票支持)更仔细地阅读编辑内容,那就太好了。 - Jens Gustedt根据你提到的,char
是8位整数值。
大多数实际用途来说,它们不需要严格为负数。由于它们必须表示为位,并允许对其执行算术操作,因此将其表示为int
。当然,也有unsigned char
。
signed char c = -1;
printf("%c %d\n", c, c);
c = c >> 1;
printf("%c %d\n", c, c);
如果你使用 unsigned char
而不是 signed char
,结果会有所不同(至少在我的“AMD Athlon(tm) 64 Processor”上,在cygwin下使用gcc)。原因是当你对一个无符号值进行右移时,它会用零填充,而当你对一个负的有符号值进行相同操作时,它会用一填充。
虽然我不能确定这是否有用,但这是一个字符符号很重要的情况。