为什么像signed char
和unsigned char
这样两个具有相同值的字符不相等?
char a = 0xfb;
unsigned char b = 0xfb;
bool f;
f = (a == b);
cout << f;
在上面的代码中,f
的值为0。
当a
和b
都具有相同的值时,为什么会这样?
答案 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_MAX
为127
,{{1} }可能是a
。正式地说,如果-5
是char
且该数字不适合signed
,则转换是实现定义的,或者引发实现定义的信号。
char
是b
。
为进行比较251
(并保留a == b
是比char
窄的假设),两个 参数都转换为{{1} },因此保留了int
和int
。
那是-5
,因为数字不相等。
最后,请注意,在251
,false
和char
大小均相同的平台上,代码的结果为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
,它们的确不相等。