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

所以我知道 signed intunsigned int之间的区别在于,一个位用来表示数字是正还是负,但是如何应用到 char上呢?一个角色怎么可能是积极的或消极的?

310605 次浏览

有三种字符类型: (普通) charsigned charunsigned char。任何字符通常是一个8位整数 * ,在这个意义上,signedunsigned char有一个有用的含义(通常等同于 uint8_tint8_t)。当用作文本意义上的字符时,使用 char(也称为纯字符)。这通常是一个 signed char,但是可以由编译器以任何一种方式实现。

* 从技术上讲,只要 sizeof(char)是1,char 可以是任意大小,但它通常是一个8位整数。

在 C 语言中没有专门的“字符类型”。char是一个整数类型,与 intshort和其他整数类型相同(在这方面)。char恰好是最小的整数类型。因此,就像任何其他整数类型一样,它可以是有符号的,也可以是无符号的。

的确(顾名思义) char主要用于表示字符。但是 C 中的字符是由它们的整数“代码”表示的,所以使用整数类型 char来实现这一目的并没有什么不寻常的。

char和其他整数类型之间的唯一一般性区别是,普通的 char并不等同于 signed char,而对于其他整数类型,signed修饰符是可选的/隐含的。

就像 int可以是正数也可以是负数一样。没有区别。实际上在许多平台上,不合格的 char是签名的。

同样的方法——例如,如果你有一个8位的字符,7位可以用来表示大小,1位表示符号。因此,无符号字符可能范围从0到255,而有符号字符可能范围从 -128到127(例如)。

这是因为 char在所有效果中都存储为8位数字。如果你认为它是一个 ASCII 码(可以只是签名 *) ,那么谈论一个负值或正值的 char是没有意义的,但是如果你使用 char来存储一个数字,它可以在0-255或 -128的范围内,那么它就是有意义的。.127根据2-补数表示法。

* : 它也可以是无符号的,它实际上取决于我认为的实现,在这种情况下,您将有权访问扩展的 ASCII 字符集所使用的编码

signed char是一个有符号值,它通常小于 short,并且保证不大于 shortunsigned char是一个无符号值,它通常小于 short,并且保证不大于 short。没有 signedunsigned限定符的 char类型可以表现为有符号的或无符号的 char; 这通常是实现定义的,但在一些情况下它不是:

  1. 如果在目标平台的字符集中,标准 C 所需的任何字符都会映射到高于最大“有符号 char”的代码,那么“ char”必须是无符号的。
  2. 如果“ char”和“ short”大小相同,则必须对“ char”进行签名。

有两种方言的“ C”(那些 char是有符号的,那些是无符号的)的部分原因是有一些实现 char 必须的是无符号的,和其他 必须的是有符号的。

表象是一样的,意义是不同的。例如,0xFF,它都表示为“ FF”。当它被视为“ char”时,它是负数 -1; 但它是无符号的255。当涉及到位移,这是一个很大的差异,因为符号位没有移动。例如,如果你将255向右移动1位,它将得到127; 将“-1”向右移动将不会产生任何效果。

我有点不同意上述观点。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”,就像从程序中删除注释一样。