有符号/无符号字符之间的区别[重复]

Posted

技术标签:

【中文标题】有符号/无符号字符之间的区别[重复]【英文标题】:Difference between signed / unsigned char [duplicate] 【发布时间】:2011-05-19 05:50:15 【问题描述】:

所以我知道signed intunsigned int 之间的区别在于,一个位用于表示数字是正数还是负数,但这如何适用于char?一个角色怎么可能是正面的或负面的?

【问题讨论】:

A previous answer 在这个话题上会有帮助。 “所以我知道有符号整数和无符号整数之间的区别在于,一个位用于表示数字是正数还是负数” - 请注意,这只是实现它的方法之一,而不是最常见和最实用的方法。 【参考方案1】:

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

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

【讨论】:

"共有三种 char 类型" - 仅适用于 C++。 @Martin 它适用于 C 的程度比适用于 C++ 更大【参考方案2】:

C 语言中没有专用的“字符类型”。 char 是一个整数类型,与intshort 和其他整数类型相同(在这方面)。 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 “charsigned charunsigned 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 是一个有符号值,通常小于并且保证不会大于shortunsigned char 是一个无符号值,通常小于并且保证不会大于 short。没有 signedunsigned 限定符的类型 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 补码以及符号和幅度之间进行选择。

以上是关于有符号/无符号字符之间的区别[重复]的主要内容,如果未能解决你的问题,请参考以下文章

有符号和无符号字符之间的比较

有符号整数与无符号整数

字符是有符号还是无符号?

为啥在有符号和无符号表示之间转换一个数字?

Arduino 在 uint32_t 和无符号字符之间转换

C ++十六进制字符串到无符号整数[重复]