C语言中对有符号和无符号字符有什么要求?
在 C 中使用有符号和无符号字符有什么特殊原因吗?还是只是为了完整性而添加,以便编译器在添加有符号/无符号修饰符之前不必检查数据类型?
我不是在询问有符号和无符号变量。我的疑问是无符号字符变量不足以使您必须依赖有符号字符变量的特殊情况。
C语言中对有符号和无符号字符有什么要求?
在 C 中使用有符号和无符号字符有什么特殊原因吗?还是只是为了完整性而添加,以便编译器在添加有符号/无符号修饰符之前不必检查数据类型?
我不是在询问有符号和无符号变量。我的疑问是无符号字符变量不足以使您必须依赖有符号字符变量的特殊情况。
Achar
可以是有符号的或无符号的,具体取决于对底层硬件最有效的方法。关键字signed
并unsigned
允许您明确指定您想要其他东西。
引用 C99 的理由:
指定了三种类型
char
:signed
、plain 和unsigned
。与先前的实践一样,根据实现, plainchar
可以表示为有符号或无符号。该类型signed char
是在 C89 中引入的,以便在那些实现普通char
为unsigned char
. 出于对称原因,signed
允许关键字作为其他整数类型的类型名称的一部分。
信息 #1: char
在 C 中只是一个小的int
,它使用 8 位。
信息#2:signed
和之间的区别在于unsigned
表示中的一位用作signed
变量的符号位。
信息#3:由于(#2),signed
变量保持不同的范围(-128 到 127,char
以防万一)与unsigned
(0 到 255,以防万一)相比char
。
QA #1:我们为什么需要unsigned
?
在大多数情况下(例如表示指针)我们不需要有符号变量。按照惯例,内存中的所有位置都作为无符号地址的连续数组公开给程序。
QA #2:我们为什么需要signed
?
一般来说,做有符号算术。
我假设您使用 char 来保存数字,而不是字符。
所以:
signed char 至少为您提供 -128 到 127 的范围。unsigned char 至少为您提供 0 到 255 的范围。
标准要求 char 至少为 8 位,所以这至少是我这么说的原因。这些值可能更大。
无论如何,要回答您的问题,将 char 设置为 unsigned 释放了将第一位作为“符号”位的要求,从而使您可以保持有符号 char 的近两倍。
您必须了解的是数据类型“char”实际上只是一个整数,通常为 8 位宽。假设您尊重减少的值限制,您可以像使用任何其他间数据类型一样使用它。没有理由将“char”限制为字符。
在 32/64 位处理器上,通常不需要使用如此小的整数字段,但在 8 位处理器(例如 8051)上,8 位整数不仅处理速度快得多,而且使用更少(有限)记忆。