我知道多字符字符常量表示为int
。而且我知道它的值取决于编译器。但是我的问题是,当我将多字符字符常量存储在char
变量中时,它的行为将有所不同。
#include <iostream>
int main() {
std::cout << 'asb';
return 0;
}
输出:6386530
#include <iostream>
int main() {
char a = 'asb';
std::cout << a;
return 0;
}
输出:b
答案 0 :(得分:3)
案例1:
您得到'a'*256²+'s'*256+'b' = 6386530
因为'a' = 97
,'s' = 115
,'b' = 98
cf。 ASCII表
'asb'被解释为整数。
typeid('asb').name()[0] == 'i' && sizeof('asd') == 4;
整数是32位,您可以将'asb'(24位)存储为整数。 这就是为什么std :: cout将其解释为整数并显示6386530
请注意:
typeid('xxxxabcd').name()[0] == 'i' && sizeof('xxxxabcd') == 4;
但是'xxxxabcd'由64位表示,因此丢失了32位。
std::cout << 'xxxxabcd';
std::cout << 'abcd';
将打印相同的内容。
情况2: “ asb”被解释为整数,并将其转换为char(8位)。 正如@BenjaminJones指出的那样,仅保存最后8位(98 =='b')。 并且std :: cout会将其解释为一个字符,因此显示为“ b”。
无论如何,两个案例均会引发编译警告,例如:
warning: multi-character character constant [-Wmultichar]
warning: multi-character character constant [-Wmultichar] In function 'int main()'
warning: overflow in implicit constant conversion [-Woverflow]
我猜行为取决于编译器。
答案 1 :(得分:1)
您不按原样存储multi-char常量的值。您将该值转换为另一个char
范围内的值。由于还通过完全不同的operator<<
重载来打印值(char
的重载,而不是int
的重载),因此,由于以下原因,输出将有所不同那也是。
答案 2 :(得分:1)
在第二个示例中,文字是一个转换为char的int。因此,这里有一些特定于实现的问题:
似乎正在发生的事情是'asb'被解释为6386530,然后根据rules for conversion from int to an unsigned char被截断。换句话说,是6386530%256 == 97 =='b'。