所以我知道有符号和无符号int之间的区别在于,有一点用于表示数字是正数还是负数,但这如何适用于char?一个角色怎么能是积极的还是消极的?
答案 0 :(得分:115)
C语言中没有专用的“字符类型”。 char
是整数类型,与int
,short
和其他整数类型相同(在这方面)。 char
恰好是最小的整数类型。因此,就像任何其他整数类型一样,它可以是有符号或无符号的。
确实(顾名思义)char
主要用于表示字符。但是C中的字符由它们的整数“代码”表示,因此使用整数类型char
来实现该目的并没有什么异常。
char
与其他整数类型之间唯一的一般区别是普通char
通常与signed char
不是同义词,而对于其他整数类型,signed
修饰符是可选的/暗示。
答案 1 :(得分:40)
我对上述内容略有不同意见。 unsigned char 仅表示:使用最高有效位而不是在执行算术运算时将其视为+/-符号的位标志。
如果您将 char 用作例如数字
,这很有意义typedef char BYTE1;
typedef unsigned char BYTE2;
BYTE1 a;
BYTE2 b;
对于变量 a ,只有7位可用,其范围是(-127到127)=(+/-)2 ^ 7 -1。 对于变量 b ,所有8位都可用,范围为0到255(2 ^ 8 -1)。
如果您使用 char 作为字符,编译器会完全忽略“unsigned”,就像从程序中删除注释一样。
答案 2 :(得分:21)
有三种字符类型:(普通)char
,signed char
和unsigned char
。任何char通常都是8位整数*,从这个意义上说,signed
和unsigned char
具有有用的含义(通常相当于uint8_t
和int8_t
)。当用作文本意义上的字符时,请使用char
(也称为普通字符)。这通常是signed char
,但可以由编译器以任何方式实现。
*从技术上讲,只要sizeof(char)
为1,char就可以是任意大小,但它通常是一个8位整数。
答案 3 :(得分:13)
表示是一样的,意思是不同的。例如,0xFF,它都表示为“FF”。当它被视为“char”时,它是负数-1;但它是255无符号。当涉及到位移位时,由于符号位没有移位,所以它是一个很大的区别。例如,如果你向右移动255位,它将获得127;向右移“-1”将无效。
答案 4 :(得分:10)
'signed char'是一个有符号的值,通常小于,并且保证不会大于'short'。 'unsigned char'是无符号值,通常小于,并且保证不大于'short'。没有有符号或无符号限定符的类型'char'可以表现为有符号或无符号字符;这通常是实现定义的,但有几种情况不是:
有两种方言的部分原因是“C”(那些'char'被签名,而那些是无符号的)是有些实现'char'必须未签名的,以及必须签名的其他人。
答案 5 :(得分:2)
这是因为char
作为8位数存储在所有效果中。如果你认为它是一个ASCII代码(可以只是签名*),那么说一个消极的或肯定的char
是没有意义的,但是如果你用char
来存储一个数字就有意义了根据2 - 补码表示,在0-255范围内或在-128..127范围内。
*:它也可以是无符号的,它实际上取决于我认为的实现,在这种情况下,您将可以访问由所使用的编码提供的扩展ASCII字符集
答案 6 :(得分:1)
int
可以是正面还是负面的方式。没有区别。实际上,在许多平台上,不合格char
已经签署。
答案 7 :(得分:1)
以同样的方式 - 例如如果你有一个8位字符,7位可以用于幅度,1位用于符号。因此,unsigned char的范围可以是0到255,而有符号的char可以是-128到127(例如)。