字符是有符号还是无符号?

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 charsigned char,或者如果您想强制宽度,请使用stdint.h 中的uint8_tint8_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 具有带符号类型和负值,则结果值是实现定义的。"

以上是关于字符是有符号还是无符号?的主要内容,如果未能解决你的问题,请参考以下文章

char类型到底是有符号还是无符号

请问FPGA中Dec表示是有符号还是无符号型啊

QImage 格式 Format_ARGB32 数据是有符号还是无符号整数?

java 中怎么把char型转换成无符号数

有符号/无符号字符之间的区别[重复]

java数据类型是有符号的,那与有些无符号的如何区别