有符号/无符号字符之间的区别

时间:2010-12-02 16:22:36

标签: c types

所以我知道有符号和无符号int之间的区别在于,有一点用于表示数字是正数还是负数,但这如何适用于char?一个角色怎么能是积极的还是消极的?

8 个答案:

答案 0 :(得分:115)

C语言中没有专用的“字符类型”。 char是整数类型,与intshort和其他整数类型相同(在这方面)。 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)

有三种字符类型:(普通)charsigned charunsigned char。任何char通常都是8位整数*,从这个意义上说,signedunsigned char具有有用的含义(通常相当于uint8_tint8_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'可以表现为有符号或无符号字符;这通常是实现定义的,但有几种情况不是:

  1. 如果在目标平台的字符集中,标准C所需的任何字符都将映射到高于最大签名字符的代码,则“char”必须是无符号的。
  2. 如果'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(例如)。