【发布时间】:2011-08-07 06:27:14
【问题描述】:
我们需要签名字符的可能情况有哪些?我想它的唯一用途是将 char 数量转换为整数。
【问题讨论】:
我们需要签名字符的可能情况有哪些?我想它的唯一用途是将 char 数量转换为整数。
【问题讨论】:
如果我没记错的话,“char”可能是有符号或无符号的(这取决于编译器/实现)。如果您需要 unsigned char,则应明确要求(使用“unsigned char”),如果您需要signed char,则应明确要求(使用“signed char”)。
“char”只是一个(通常为 8 位)整数。与人物无关。
一个角色可以是任何东西,这取决于你在做什么。我更喜欢使用“uint32_t”和 Unicode (UTF-32)。对于使用 ASCII 的老旧/损坏的软件,char 很好(不管“char”是有符号的还是无符号的)。对于 UTF-8,您可能希望使用“unsigned char”或“uint8_t”。
您可能还想尝试使用“wchar_t”(和“wchar.h”标头),但有很多方法可能会出错(如果您受到诱惑,请进行一些研究)。
【讨论】:
char 是一个整数,通常宽度为8位。但是因为它的符号是实现定义的(即取决于编译器),所以将它用于算术可能不是一个好主意。请改用unsigned char 或signed char,或者如果您想强制宽度,请使用stdint.h 中的uint8_t 和int8_t。
【讨论】:
uint8_t 对宽度做出明确的假设,特别是如果它存在,则暗示char 的宽度为8 位。此外,如果那些批准此类编辑的人(肯定有两个人投票赞成)更仔细地阅读这些编辑,那就太好了。
允许编译器对char 进行简单签名的原因是,在 C 编程语言的早期,每个整数类型都是有符号的。当无符号类型被添加到语言中时,肯定已经有太多的现有代码将 -1 作为标记值存储在 char 变量中,因此在现有系统上更改编译器是不可行的,例如char 没有签名。无论如何,未签名的字符可能没有太大的压力。 C 语言的早期发展发生在 7 位 ASCII 上。
由于 C 被移植到有 8 位可打印字符的平台(例如 IBM 大型机使用 EBCDIC 或 PC),那里的编译器将 char 设为无符号,因为具有负值的可打印字符会更大便携性的噩梦比无法将 -1 存储在 char 中。另一方面,这导致了目前可移植代码无法对 char 的符号性做出任何假设的情况。
【讨论】:
与您提到的一致,char 是 8 位整数值。
对于大多数实际目的,您不会严格要求它们为负数。由于它们必须表示为位并允许对其执行算术运算,因此它们表示为int。当然,你也有unsigned char。
【讨论】:
在您想要表示 [-128, 127] 范围内的值的任何地方都适合使用有符号字符。如果您有一个包含许多字段的结构,这些字段将被实例化很多次,那么保持数据类型尽可能小是相关的。
【讨论】:
在下面的代码中:
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 处理器”上,在 cygwin 下使用 gcc)。原因是当你右移一个无符号值时,它会被填充零,当你对一个负的有符号值做同样的事情时,它会被填充一。
虽然这有用吗,我不知道...但这是一个字符符号很重要的情况。
【讨论】: