signed / unsigned char之间的区别
所以我知道有符号和无符号整数之间的区别是有点用来表示数字是正数还是负数,但是这怎么适用于char? 一个angular色如何能够正面或负面?
C语言中没有专用的“字符types”。 char
是一个整数types,与int
, short
和其他整数types相同(在这方面)。 char
恰好是最小的整数types。 所以,就像任何其他整数types一样,它可以是有符号的或无符号的。
确实(顾名思义) char
主要是用来表示字符。 但是C中的字符是由它们的整数“代码”表示的,所以没有什么不寻常的事实,即使用整数types的char
来达到这个目的。
char
和其他整数types之间唯一的区别就是plain char
通常不是signed char
同义词,而其他整数types的signed
modifier是可选/隐含的。
我稍微不同意以上。 无符号字符只是意味着:在执行算术运算时,使用最高有效位而不是将其作为+/-符号的位标志。
如果你使用char作为一个数字,这是很重要的:
typedef char BYTE1; typedef unsigned char BYTE2; BYTE1 a; BYTE2 b;
对于variablesa ,只有7位可用,其范围是(-127到127)=(+/-)2 ^ 7 -1。 对于variablesb,所有8位都是可用的,范围是0到255(2 ^ 8 -1)。
如果使用char作为字符,编译器完全忽略“unsigned”,就像从程序中删除注释一样。
有三种字符types:(普通) char
, signed char
和unsigned char
。 任何字符通常是一个8位整数*,从这个意义上讲,有signed
和unsigned char
有一个有用的含义(通常相当于uint8_t
和int8_t
)。 当用作文本意义上的字符时,使用char
(也称为普通字符)。 这通常是一个有signed char
但可以由编译器以任何方式实现。
*从技术上讲,只要sizeof(char)
是1, sizeof(char)
大小可以是任意大小,但通常是一个8位的整数。
表示是一样的,意思是不同的。 例如0xFF,它们都表示为“FF”。 当它被视为“char”时,它是负数-1; 但它是无符号的255。 当涉及位移时,由于符号位未被移位,所以这是一个很大的区别。 例如,如果你将255右移1位,它将得到127; 向右移动“-1”将不起作用。
“有符号的字符”是一个有符号的值,通常小于,并保证不会大于“短”。 一个“无符号字符”是一个无符号的值,通常小于,并保证不会比“短”大。 没有签名或无符号限定符的types“char”可能performance为有符号或无符号的字符; 这通常是实现定义的,但是有一些情况不是:
- 如果在目标平台的字符集中,标准C所需的任何字符将映射到高于最大带符号字符的代码,则“char”必须是无符号的。
- 如果'字符'和'短'是相同的大小,那么'字符'必须签名。
部分原因有两个“C”的方言(那些'char'被签名,而那些没有签名的)是有一些实现'char' 必须是无符号的,还有一些是必须签名的。
这是因为一个char
被存储在所有的效果作为一个8位数字。 如果您认为它是一个ASCII码(可以是刚刚签名的*),但是如果使用该char
来存储一个数字(这个数字可能在0-255范围内)或者在-128..127根据2补码表示。
*:它也可以是无符号的,它实际上取决于我认为的实现,在这种情况下,您将有权访问由编码提供的扩展ASCII字符集
同样的方式如何一个int
可以是积极的或消极的。 没有区别。 实际上在许多平台上不合格的char
被签名。
同样的方式 – 例如,如果你有一个8位字符,可以使用7位的幅度和1的符号。 所以一个无符号的字符可能范围从0到255,而一个有符号的字符可能范围从-128到127(例如)。