为什么两个char相似signed char并且unsigned char具有相同的值不相等?
char a = 0xfb;
unsigned char b = 0xfb;
bool f;
f = (a == b);
cout << f;
Run Code Online (Sandbox Code Playgroud)
在上面的代码中,值为f0.
为什么如此当两个a与b具有相同的价值?
没有算术运算符接受小于的整数int.因此,两个char值都会升级到int第一个,请参阅完整促销
以获取完整详细信息.
char在您的平台上签名,所以0xfb升级到int(-5),而unsigned char升级到int(0x000000fb).这两个整数不相等.
另一方面,[basic.fundamental]中的标准要求所有char类型占用相同的存储量并具有相同的对齐要求; 也就是说,它们具有相同的对象表示,并且对象表示的所有位都参与值表示.因此,memcmp(&a, &b, 1) == 0是true.
f事实上,并且实际上是程序的行为的价值是实现定义的.
在C++ 14日起1,对于一个signed char,并假设CHAR_MAX是127,a将可能-5.从形式上讲,如果char是signed且数字不适合a char,则转换是实现定义的,或者引发实现定义的信号.
b是251.
为了进行比较a == b(和保持假定char是比更窄的类型int)这两个参数被转换为int,与-5和251因此保留.
这就是false数字不相等.
最后,请注意,在一个平台上char,short和int,都是相同的大小,代码的结果将是true(并且==将在unsigned类型中)!故事的寓意:不要混淆你的类型.
1 C++ 14掉落了1的补码和有符号的幅度signed char.