有符号/无符号字符之间的区别[重复]
Posted
技术标签:
【中文标题】有符号/无符号字符之间的区别[重复]【英文标题】:Difference between signed / unsigned char [duplicate] 【发布时间】:2011-05-19 05:50:15 【问题描述】:所以我知道signed int
和unsigned int
之间的区别在于,一个位用于表示数字是正数还是负数,但这如何适用于char
?一个角色怎么可能是正面的或负面的?
【问题讨论】:
A previous answer 在这个话题上会有帮助。 “所以我知道有符号整数和无符号整数之间的区别在于,一个位用于表示数字是正数还是负数” - 请注意,这只是实现它的方法之一,而不是最常见和最实用的方法。 【参考方案1】:共有三种字符类型:(普通)char
、signed char
和 unsigned char
。任何字符通常是一个 8 位整数*,从这个意义上说,signed
和 unsigned char
具有有用的含义(通常等同于 uint8_t
和 int8_t
)。当用作文本意义上的字符时,请使用char
(也称为纯字符)。这通常是 signed char
,但可以由编译器以任何一种方式实现。
* 从技术上讲,char 可以是任意大小,只要sizeof(char)
为 1,但通常是 8 位整数。
【讨论】:
"共有三种 char 类型" - 仅适用于 C++。 @Martin 它适用于 C 的程度比适用于 C++ 更大【参考方案2】:C 语言中没有专用的“字符类型”。 char
是一个整数类型,与int
、short
和其他整数类型相同(在这方面)。 char
恰好是最小的整数类型。因此,就像任何其他整数类型一样,它可以是有符号或无符号的。
确实(顾名思义)char
主要用于表示字符。但是 C 中的字符由它们的整数“代码”表示,因此整数类型 char
用于实现这一目的并没有什么不寻常的。
char
和其他整数类型之间的唯一一般区别是普通的 char
不是 signed char
的同义词,而对于其他整数类型,signed
修饰符是可选/隐含的。
【讨论】:
好吧,希望你能在这里和我在一起,我对位/C 之类的东西不是很好。那么对于带符号的字符,像“01011011”这样的东西可以代表一个字符吗? @Chiggins:它是二进制的吗?如果是这样,那么是的。您的01011011
是 91 的二进制表示。因此,它代表您平台上代码为 91 的任何字符(例如,PC 上的[
)。
为了简单证明 chars 是 int 的性质,请尝试应用 swtich...case
,它只能应用于整数数值。
C89 6.1.2.5 "共有三种字符类型,指定为 char 、signed char 和 unsigned char。" C11 6.2.5p15 “char
、signed char
、unsigned char
这三种类型统称为字符类型。” 6.2.5fn45 "char
是与其他两个不同的类型,并且与任何一个都不兼容"【参考方案3】:
int
可以是正数或负数。没有区别。实际上在许多平台上,char
是不合格的签名。
【讨论】:
【参考方案4】:同样的方式——例如如果您有一个 8 位字符,则 7 位可用于幅度,1 位可用于符号。因此,无符号字符的范围可能是 0 到 255,而有符号字符的范围可能是 -128 到 127(例如)。
【讨论】:
【参考方案5】:这是因为 char
在所有效果中都存储为 8 位数字。如果您认为char
是一个 ASCII 码(可以只是签名*),那么谈论一个负数或正数 char
是没有意义的,但如果您使用该 char
来存储一个可能在 0 范围内的数字,那么它是有意义的-255 或 -128..127 根据 2-补码表示。
*:它也可以是无符号的,它实际上取决于我认为的实现,在这种情况下,您将可以访问所使用的编码提供的扩展 ASCII 字符集
【讨论】:
【参考方案6】:signed char
是一个有符号值,通常小于并且保证不会大于short
。 unsigned char
是一个无符号值,通常小于并且保证不会大于 short
。没有 signed
或 unsigned
限定符的类型 char
可能表现为有符号或无符号 char
;这通常是实现定义的,但也有几种情况不是:
-
如果在目标平台的字符集中,标准 C 要求的任何字符将映射到高于最大 `signed char` 的代码,则 `char` 必须是无符号的。
如果 `char` 和 `short` 大小相同,则必须对 `char` 进行签名。
“C”有两种方言(char
有符号的方言和无符号的方言)的部分原因是在某些实现中char
必须未签名的,以及其他必须签名的地方。
【讨论】:
【参考方案7】:表示是一样的,意思是不同的。例如,0xFF,它都表示为“FF”。当它被视为“char”时,它是负数-1;但它是 255 未签名。当涉及到位移时,这是一个很大的区别,因为符号位没有移动。例如,如果将 255 右移 1 位,它将得到 127;向右移动“-1”将无效。
【讨论】:
请注意,有符号类型的右位移行为实际上是实现定义的。 “大多数”编译器会将-1
转换为/-1
,但实际上您也可以得到10111111
【参考方案8】:
我有点不同意上面的说法。 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
作为字符,编译器会完全忽略“无符号”,就像从程序中删除 cmets 一样。
【讨论】:
我认为你做错了(如果我错了,请纠正我):“a”是有符号字符,所以范围是 -128 到 127,“b”是无符号字符,所以范围是 0到 255。similar question 您需要更改此答案以反映有符号整数使用二进制补码,而不是您所说的符号位,因为目前这个答案是不正确的。 这是不正确的。在 C 中,有符号整数类型使用二进制补码,范围为-(2^n-1)
到 (2^n-1)-1
,其中 n
是位数,0
只计算一次,而不是两次。默认情况下,char
是未签名的,未签名的。请更正这一点;这是一个简单的但不正确的解释。
wizzwizz4: AFAIK 如果 char 未签名或默认签名由实现定义而不是标准(例如,请参阅***.com/a/2054941/138526)
@wizzwizz4 C 标准没有定义有符号整数的编码格式。由编译器设计者在 2s 补码、1s 补码以及符号和幅度之间进行选择。以上是关于有符号/无符号字符之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章