有符号和无符号字符

Signed and unsigned char

本文关键字:字符 无符号 符号      更新时间:2023-10-16

为什么两个字符像signed char和具有相同值的unsigned char不相等?

char a = 0xfb; 
unsigned char b = 0xfb;
bool f;
f = (a == b); 
cout << f;

在上面的代码中,f的值为 0。
ab具有相同的价值时,为什么会这样?

没有接受小于 int 的整数的算术运算符。因此,两个字符值都首先提升为 int,请参阅积分提升 了解完整详情。

char在您的平台上签名,因此0xfb被提升为int(-5),而unsigned char被提升为int(0x000000fb)。这两个整数的比较不相等。

另一方面,[basic.fundamental] 中的标准要求所有 char 类型占用相同的存储量并具有相同的对齐要求;也就是说,它们具有相同的对象表示,并且对象表示的所有位都参与值表示。因此,memcmp(&a, &b, 1) == 0true.

f的值,实际上是程序的行为,都是实现定义的

在C++14以后的1中,对于一个signed char,假设CHAR_MAX127a可能会-5。从形式上讲,如果char signed并且该数字不适合char,则转换是实现定义的或实现定义的信号被提出。

b251.

对于比较a == b(并保留charint更窄的假设(,两个参数都转换为int,因此保留-5251

这很false,因为数字不相等。

最后,请注意,在 charshortint 大小相同的平台上,代码的结果将是true的(==将是unsigned类型(!这个故事的寓意是:不要混合你的类型


1 C++14 删除了 1 的补码并签署了星等signed char

(
  • 有符号(char的值范围[-128, 127]。(C++14 下降 -127 作为下限(。
  • unsigned char的值范围[0, 255]

您尝试分配给两个变量的内容以十进制251。由于char无法保存该值,因此您将遭受值溢出,如以下警告所示。

警告:从"int"到"char"的转换中的溢出会将值从"251"更改为"\37777777773" [-Woverflow]

因此a可能会保持价值-5b将是251的,它们确实不平等。