字符是签名还是未签名?

时间:2011-08-07 06:27:14

标签: c char

我们需要签名字符的可能情况是什么?我想这个唯一的用途是将char数量转换为整数。

6 个答案:

答案 0 :(得分:3)

如果我没记错,“char”可以是有符号或无符号的(取决于编译器/实现)。如果你需要一个unsigned char,你应该明确地要求它(带有“unsigned char”),如果你需要一个签名的char,你应该明确地要求它(带有“signed char”)。

“char”只是一个(通常是8位)整数。它与角色无关。

角色可以是任何东西,取决于你正在做什么。我更喜欢使用“uint32_t”和Unicode(UTF-32)。对于使用ASCII的硬件旧/损坏的软件,char很好(无论“char”是签名还是未签名)。对于UTF-8,你可能想要使用“unsigned char”或“uint8_t”。

您可能也试图尝试使用“wchar_t”(以及“wchar.h”标题),但有很多方法可能出错(如果您受到诱惑,请做一些研究)。

答案 1 :(得分:2)

char 一个整数,通常宽度为8位。但是因为它的签名是实现定义的(即取决于编译器),所以将它用于算术可能不是一个好主意。请改为使用unsigned charsigned char,或者如果您想强制使用宽度,请使用uint8_t中的int8_tstdint.h

答案 2 :(得分:2)

允许编译器进行简单char签名的原因是,在C编程语言的早期阶段,每个整数类型都已签名。当无符号类型被添加到语言中时,必须已经存在太多现有代码,这些代码在char变量中存储-1作为标记值,​​在现有系统上更改编译器是不可行的。 char未签名。无论如何,对于未签名的字符可能没有任何巨大的压力; C的早期开发发生在7位ASCII上。

由于C被移植到有8位可打印字符的平台(例如IBM大型机说EBCDIC或PC),因此编译器char无符号,因为具有负值的可打印字符将是甚至更大的可移植性噩梦比不能在char中存储-1。另一方面,这导致了当前的情况,即可移植代码无法对char的签名做出任何假设。

答案 3 :(得分:0)

与您提到的内容一致,char是8位整数值。 对于大多数实际目的,你不会严格要求它们为负。因为,它们必须表示为位并允许对它们执行算术运算,它们表示为int。当然,你也有unsigned char

答案 4 :(得分:0)

在您想要表示[-128,127]范围内的值的任何地方,都可以使用带符号的字符。如果你有一个包含许多字段的结构,这些字段将被多次实例化,那么保持数据类型尽可能小是相关的。

答案 5 :(得分:0)

在下面的代码中:

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处理器”上使用gcc在cygwin下)。这样做的原因是当你右移无符号值时,它用零填充,当你用带符号的值做负值时,它用一个填充。

这是否有用,我不知道......但这是一个炭的问题的情况。

相关问题