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

Chi*_*ins 130 c types

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

AnT*_*AnT 123

C语言中没有专用的"字符类型".char是整数类型,与(在这方面)相同int,short以及其他整数类型.char恰好是最小的整数类型.因此,就像任何其他整数类型一样,它可以是有符号或无符号的.

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

char和其他整数类型之间唯一的一般区别是plain char通常不是同义词signed char,而对于其他整数类型,signed修饰符是可选的/隐含的.

  • @Chiggins:它是二进制的吗?如果是这样,那么是的。您的 `01011011` 是 91 的二进制表示。因此,它代表您平台上任何具有代码 91 的字符(例如,PC 上的 `[`)。 (3认同)
  • C89 6.1.2.5“共有三种字符类型,分别指定为char,signed char和unsigned char。” C11 6.2.5p15“三个类型的char,signed char和unsigned char统称为* character types *。” 6.2.5fn45“'char'是与其他两个不同的类型,与任何一个都不兼容” (2认同)

Sim*_*low 42

我略微不同意上述情况.该无符号字符只是意味着:使用最显著位,而不是执行算术运算时,将它视为对+/-号位标志.

如果你使用char作为数字,这很有意义:

typedef char BYTE1;
typedef unsigned char BYTE2;

BYTE1 a;
BYTE2 b;
Run Code Online (Sandbox Code Playgroud)

对于变量a,只有7位可用,其范围是(-127到127)=(+/-)2 ^ 7 -1.对于变量b,所有8位都可用,范围是0到255(2 ^ 8 -1).

如果使用char作为字符,编译器将完全忽略"unsigned",就像从程序中删除注释一样.

  • **这是不正确的**.在C中,有符号整数类型使用两个补码,范围为` - (2 ^ n-1)`到`(2 ^ n-1)-1`,其中`n`是位数,'0'是计数一次,不是两次.默认情况下,`char`是未签名的,未签名.请纠正这个; 这是一个简单但不正确的**解释. (9认同)
  • 我认为你犯了一个错误(纠正我,如果我错了):"a"是签名字符,所以范围是-128到127而"b"是无符号字符,所以范围是0到255. [类似问题]( http://stackoverflow.com/questions/75191/what-is-an-unsigned-char) (4认同)
  • wizzwizz4:AFAIK **如果char是未签名的或默认情况下是由实现定义的,则**不是由标准定义的(例如,请参见http://stackoverflow.com/a/2054941/138526) (4认同)
  • 你需要改变这个答案,以反映有符号的整数使用二进制补码,而不是像你说的那样一个符号位,因为它的立场答案是不正确的. (3认同)
  • @wizzwizz4 C 标准没有定义有符号整数的编码格式。由编译器设计人员在 2s 补码、1s 补码和符号和幅度之间进行选择。 (3认同)
  • @ wizzwizz4就我对C11标准的理解而言,实际的最小值*是* -127。因此,您最终不会得到-128。参见第5.2.4.2.1节。 (2认同)

DrA*_*rAl 21

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

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

  • @Martin它比C++更适用于C语言 (2认同)

小智 14

表征是一样的,意思是不同的.例如,0xFF,它都表示为"FF".当它被视为"char"时,它是负数-1; 但它是255无符号.当涉及到位移位时,由于符号位没有移位,所以它是一个很大的区别.例如,如果你向右移动255位,它将得到127; 向右移"-1"将无效.

  • 请注意,有符号类型的右位移位行为实际上是实现定义的。“大多数”编译器会将`-1`转换为`/-1`,但实际上你也可以得到`10111111` (2认同)

sup*_*cat 10

'signed char'是一个带符号的值,通常小于,并且保证不会大于'short'.'unsigned char'是无符号值,通常小于,并且保证不大于'short'.没有有符号或无符号限定符的类型'char'可以表现为有符号或无符号字符; 这通常是实现定义的,但有几种情况不是:

  1. 如果在目标平台的字符集中,标准C所需的任何字符将映射到高于最大签名字符的代码,则'char'必须是无符号的.
  2. 如果'char'和'short'的大小相同,则必须签署'char'.

有两种方言的部分原因是"C"(其中'char'被签名的那些,以及那些未签名的方言)是有些实现'char' 必须是无符号的,而其他的必须签名.