已签名和未签名的字符

时间:2018-08-08 14:27:39

标签: c++ unsigned-char

为什么像signed charunsigned char这样两个具有相同值的字符不相等?

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

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

3 个答案:

答案 0 :(得分:8)

没有算术运算符接受小于SocketError: Failed to open TCP connection to example.com:80 (Hostname not known: example.com)的整数。因此,两个char值都首先提升为int,有关详细信息,请参见integral promotion

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

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

答案 1 :(得分:6)

f的值以及实际上是程序的行为是实现定义的

从C ++ 14开始, 1 ,对于signed char,并假设CHAR_MAX127,{{1} }可能是a。正式地说,如果-5char且该数字不适合signed,则转换是实现定义的,或者引发实现定义的信号。

charb

为进行比较251(并保留a == b是比char窄的假设),两个 参数都转换为{{1} },因此保留了intint

那是-5,因为数字不相等。

最后,请注意,在251falsechar大小均相同的平台上,代码的结果为short(并且int将是true类型)!这个故事的寓意是:不要混在一起


1 C ++ 14放弃了1的补码,并标记了幅度==

答案 2 :(得分:4)

  • (带符号的)char的值范围是[-128, 127]。 (C ++ 14将-127降为较低范围)。
  • unsigned char的值范围是[0, 255]

您要分配给两个变量的是十进制251。由于char无法保存该值,因此会发生值溢出,如以下警告所示。

  

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

因此,a可能会保留值-5,而b将是251,它们的确不相等。