多字符常量变量的值是多少

时间:2018-07-02 12:09:26

标签: c++ char

我知道多字符字符常量表示为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

3 个答案:

答案 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。因此,这里有一些特定于实现的问题:

  • 多字符文字的解释
  • char是已签名还是未签名
  • 从int转换为带符号的char(如果已签名)

似乎正在发生的事情是'asb'被解​​释为6386530,然后根据rules for conversion from int to an unsigned char被截断。换句话说,是6386530%256 == 97 =='b'。