我们需要签名字符的可能情况是什么?我想这个唯一的用途是将char数量转换为整数。
答案 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 char
或signed char
,或者如果您想强制使用宽度,请使用uint8_t
中的int8_t
和stdint.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下)。这样做的原因是当你右移无符号值时,它用零填充,当你用带符号的值做负值时,它用一个填充。
这是否有用,我不知道......但这是一个炭的问题的情况。