字符是有符号还是无符号?
Posted
技术标签:
【中文标题】字符是有符号还是无符号?【英文标题】:Are characters signed or unsigned? 【发布时间】:2011-08-07 06:27:14 【问题描述】:我们需要签名字符的可能情况有哪些?我想它的唯一用途是将 char 数量转换为整数。
【问题讨论】:
Is char signed or unsigned by default?的可能重复 【参考方案1】:如果我没记错的话,“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”标头),但有很多方法可能会出错(如果您受到诱惑,请进行一些研究)。
【讨论】:
【参考方案2】:char
是一个整数,通常宽度为8位。但是因为它的符号是实现定义的(即取决于编译器),所以将它用于算术可能不是一个好主意。请改用unsigned char
或signed char
,或者如果您想强制宽度,请使用stdint.h
中的uint8_t
和int8_t
。
【讨论】:
@tony,你怎么编辑我的答案来颠倒它的意思?使用uint8_t
对宽度做出明确的假设,特别是如果它存在,则暗示char
的宽度为8 位。此外,如果那些批准此类编辑的人(肯定有两个人投票赞成)更仔细地阅读这些编辑,那就太好了。
@I'm not tony,但“做出假设”通常意味着您没有确凿的事实可以通过,并且正在猜测。因此,他的更正或多或少意味着“如果您不想猜测宽度,请使用 int8_t”等……我会完全改写这句话,因为两个版本都有点不清楚。 "如果你想有一定的宽度,请使用固定尺寸类型,如 int8_t" 等。【参考方案3】:
允许编译器对char
进行简单签名的原因是,在 C 编程语言的早期,每个整数类型都是有符号的。当无符号类型被添加到语言中时,肯定已经有太多的现有代码将 -1 作为标记值存储在 char 变量中,因此在现有系统上更改编译器是不可行的,例如char
没有签名。无论如何,未签名的字符可能没有太大的压力。 C 语言的早期发展发生在 7 位 ASCII 上。
由于 C 被移植到有 8 位可打印字符的平台(例如 IBM 大型机使用 EBCDIC 或 PC),那里的编译器将 char
设为无符号,因为具有负值的可打印字符会更大便携性的噩梦比无法将 -1 存储在 char
中。另一方面,这导致了目前可移植代码无法对 char 的符号性做出任何假设的情况。
【讨论】:
【参考方案4】:与您提到的一致,char
是 8 位整数值。
对于大多数实际目的,您不会严格要求它们为负数。由于它们必须表示为位并允许对其执行算术运算,因此它们表示为int
。当然,你也有unsigned char
。
【讨论】:
char 是字节大小,但不一定是 8 位。 有个具有不同字节宽度的奇异处理器。【参考方案5】:在您想要表示 [-128, 127] 范围内的值的任何地方都适合使用有符号字符。如果您有一个包含许多字段的结构,这些字段将被实例化很多次,那么保持数据类型尽可能小是相关的。
【讨论】:
我认为你的意思是“签名字符”。 @Keith Thompson:谢谢,这是一个错字。【参考方案6】:在下面的代码中:
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)。原因是当你右移一个无符号值时,它会被填充零,当你对一个负的有符号值做同样的事情时,它会被填充一。
虽然这有用吗,我不知道...但这是一个字符符号很重要的情况。
【讨论】:
c 规范未定义负值的位移运算符。请参阅 6.5.7 位移位运算符:“5 E1 >> E2 的结果是 E1 右移 E2 位位置。如果 E1 具有无符号类型或 E1 具有有符号类型且非负值,则结果的值为E1 / 2E2 商的整数部分。如果 E1 具有带符号类型和负值,则结果值是实现定义的。"以上是关于字符是有符号还是无符号?的主要内容,如果未能解决你的问题,请参考以下文章