什么是未签名的字符?

时间:2020-03-05 18:56:42  来源:igfitidea点击:

在C / C ++中," unsigned char"是用来做什么的?与普通的char有何不同?

解决方案

回答

这是依赖于实现的,因为C标准没有定义char的签名。根据平台的不同,char可能是" signed"或者" unsigned"的,因此,如果实现依赖于它,则需要明确要求" signed char"或者" unsigned char"。如果我们打算表示字符串中的字符,只需使用char,因为这将与平台在字符串中放入的字符匹配。

正如我们所期望的,signed charunsigned char之间的区别。在大多数平台上,"有符号字符"将是8位二进制补码,范围是从-128到127,无符号字符将是8位无符号整数(从0到255)。 。注意,该标准不要求char类型必须有8位,只有sizeof(char)返回1. 我们可以通过limits.h中的CHAR_BIT来获取char的位数。如今,几乎没有任何平台可以提供除" 8"之外的其他功能。

这里有一个很好的关于此问题的摘要。

正如我在发布此文章后其他人提到的那样,如果我们真的想表示小整数,最好使用int8_tuint8_t

回答

signed char的范围是-128到127; unsigned char的范围是0到255.

根据编译器的不同,char等效于有符号的char或者无符号的char,但它是不同的类型。

如果我们使用的是C风格的字符串,则只需使用char。如果我们需要使用char进行算术运算(非常少见),请为可移植性明确指定有符号或者无符号。

回答

如果要将字符用作小整数,最安全的方法是使用int8_t和uint8_t类型。

回答

一些谷歌搜索发现了这一点,人们对此进行了讨论。

无符号字符基本上是一个字节。因此,如果需要一个字节的数据,则可以使用它(例如,可能要使用它来设置标志的开和关,以将其传递给函数,就像Windows API中经常执行的那样)。

回答

无符号字符是一个(无符号)字节值(0到255)。我们可能会以"字符"的形式来考虑"字符",但这实际上是一个数字值。常规的" char"是带符号的,因此我们有128个值,并且这些值使用ASCII编码映射到字符。但无论哪种情况,我们存储在内存中的都是一个字节值。

回答

就直接值而言,当已知值在" CHAR_MIN"和" CHAR_MAX"之间而无符号字符在正数端提供两倍范围时,将使用常规字符。例如,如果" CHAR_BIT"为8,则常规" char"的范围只能保证为0,127,而" unsigned char"的范围则为[0,255],已签名的char`将为[-127,127]。

就其用途而言,标准允许将POD(普通旧数据)对象直接转换为无符号字符数组。这使我们可以检查对象的表示形式和位模式。对于char或者signed char,不存在相同的安全类型修剪保证。

回答

如果我们喜欢使用各种类型的特定长度和签名,则最好使用uint8_t,int8_t,uint16_t等,因为它们完全按照他们说的做。

回答

无符号字符使用保留给常规字符符号的位作为另一个数字。这会将范围更改为[0 255],而不是[-128 127]。

通常,当我们不想要符号时,使用未签名的字符。当执行诸如移位位(shift扩展符号)之类的操作以及将char作为字节而不是将其用作数字的其他操作时,这将有所不同。

回答

无符号字符是所有技巧的心脏。在几乎所有平台的ALL编译器中,未签名的字符只是一个BYTE。 (通常)8位的无符号整数。可以视为小整数或者一堆位。

正如其他人所说,在成瘾中,标准没有定义字符的符号。因此,我们有3种不同的"字符"类型:字符,有符号字符,无符号字符。

回答

例如无符号字符的用法:

unsigend char通常用在计算机图形学中,该图形经常(尽管不总是)为每个颜色分量分配一个字节。通常会看到以24(或者32)位表示的RGB(或者RGBA)颜色,每个颜色均为无符号字符。由于无符号char值的范围为[0,255],因此通常将这些值解释为

  • 0表示完全缺少给定的颜色分量
  • 255表示给定颜色颜料的100%

因此,我们最终将得到RGB红色为(255,0,0)->(100%红色,0%绿色,0%蓝色)。

为什么不使用签名字符?算术和位移会成为问题。如前所述,带符号的char的范围实际上偏移了-128. 将RGB转换为灰度的一种非常简单且幼稚(几乎未使用)的方法是对所有三个颜色分量求平均值,但是当颜色分量的值为负时会遇到问题。使用无符号字符算术时,红色(255,0,0)平均为(85,85,85)。但是,如果这些值是带符号的字符(127,-128,-128),我们最终将得到(-99,-99,-99),即在我们的无符号字符空间中为(29、29、29)这是不正确的。

回答

不能保证在所有平台上都不能将char和unsigned char设置为8位类型,而是将其保证为8位或者更大。某些平台具有9位,32位或者64位字节。但是,当今最常见的平台(Windows,Mac,Linux x86等)具有8位字节。

回答

在C ++中,存在三种不同的字符类型:

  • char
  • 签名字符
  • unsigned char

如果我们将字符类型用于文本,请使用不合格的char

  • 它是字符文字的类型,例如" a"或者" 0"。
  • 它是组成诸如"" abcde""之类的C字符串的类型

它也可以作为数字值计算,但是不确定该值是带符号的还是无符号的。注意通过不等号进行字符比较,尽管如果将自己限制为ASCII(0-127),则几乎是安全的。

如果要将字符类型用作数字,请使用:

  • signed char,至少给我们-127到127的范围。 (-128至127是常见的)
  • unsigned char,至少为我们提供0到255的范围。

"至少",因为C ++标准仅给出了每种数字类型都必须覆盖的最小范围的值。 sizeof(char)必须为1(即一个字节),但是理论上一个字节可以是32位。 sizeof仍将其大小报告为1,这意味着我们可以使用sizeof(char)== sizeof(long)== 1.

回答

因为我觉得确实需要这样做,所以我只想陈述一些C和C ++的规则(在这方面它们是相同的)。首先,unsigned char的所有位都参与确定值(如果有任何unsigned char对象)。其次,unsigned char被明确声明为unsigned。

现在,我与某人讨论了将int类型的值-1转换为unsigned char时会发生什么情况。他拒绝将结果" unsigned char"的所有位都设置为1的想法,因为他担心符号表示。但他不必。遵循此规则,转换立即达到了预期的目的:

If the new type is unsigned, the value is converted by repeatedly adding or
  subtracting one more than the maximum value that can be represented in the new type
  until the value is in the range of the new type. (6.3.1.3p2 in a C99 draft)

那是数学上的描述。 C ++用模演算来描述它,这产生了相同的规则。无论如何,不​​能保证整数-1的所有位在转换前都是1. 那么,我们有什么,可以断言所产生的" unsigned char"的所有" CHAR_BIT"位都变为1?

  • 所有位都参与确定其值-也就是说,对象中没有填充位。
  • 仅将" UCHAR_MAX + 1"加到" -1"会产生一个范围内的值,即" UCHAR_MAX"

实际上就足够了!因此,只要我们想拥有一个无符号字符的所有位为1的字符,就可以

unsigned char c = (unsigned char)-1;

随之而来的是,转换不只是截断高阶位。二进制补码的幸运事件是它只是一个截断,但对于其他符号表示形式并不一定是正确的。