签名和未签名的字符

Tan*_*arg 4 c++ unsigned-char

为什么两个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.
为什么如此当两个ab具有相同的价值?

Max*_*kin 8

没有算术运算符接受小于的整数int.因此,两个char值都会升级到int第一个,请参阅完整促销 以获取完整详细信息.

char在您的平台上签名,所以0xfb升级到int(-5),而unsigned char升级到int(0x000000fb).这两个整数不相等.

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


Bat*_*eba 6

f事实上,并且实际上是程序的行为的价值是实现定义的.

在C++ 14日起1,对于一个signed char,并假设CHAR_MAX127,a将可能-5.从形式上讲,如果charsigned且数字不适合a char,则转换是实现定义的,或者引发实现定义的信号.

b251.

为了进行比较a == b(和保持假定char是比更窄的类型int)这两个参数被转换为int,与-5251因此保留.

这就是false数字不相等.

最后,请注意,在一个平台上char,shortint,都是相同的大小,代码的结果将是true(并且==将在unsigned类型中)!故事的寓意:不要混淆你的类型.


1 C++ 14掉落了1的补码和有符号的幅度signed char.