C++ 中的 char 和 int 如何工作

How do char and int work in C++

我可能会问一个愚蠢的问题,但我想确认 char 是如何工作的?让我举例说明我想问的问题。 假设我声明了一个 char variable 然后是 input 6 或任何整数字符。

#include <iostream>
using namespace std;
int main(){
    char a;
    cin >> a;
    cout << a*a; // I know here input's ASCII value will multiply
    return 0;
}

与整数相同 input 6

#include <iostream>
using namespace std;
int main(){
    int a;
    cin >> a;
    cout << a*a; // Why compiler not take input's ASCII Value here?
    return 0;
}

我想现在我的问题很清楚了。

char 的情况下,乘以的不是二进制,而是您输入的任何内容的 ASCII 值。在 6 的情况下,ASCII 值是 54,所以输出2916。当a是一个int时,直接存储6,所以输出36

char 是一种基本数据类型,大小为 1 字节(不一定是 8 位!!!),至少能够表示所有字符的 ASCII code range。因此,例如,char x = 'a'; 实际存储 'a' 的 ASCII 值,在本例中为 97。但是,ostream 运算符已重载,因此它们 "know" 如何处理 char,而不是在像 cout << x; 这样的行中盲目地显示 97,而是显示字符的 ASCII 表示,即 'a'

但是,无论何时执行 a * a,编译器都会执行所谓的 integral promotion,并将 char 中的数据隐式转换为 int。所以,对于编译器来说,表达式 a * a 被翻译成 (int)a * (int)a,这是 97 * 97 的结果,所以你最终显示 9409.

请注意,对于编译器而言,charint 是两种不同的类型。它可以区分两者。因此 operator<< 仅当输入的类型为 char 或可隐式转换为 char.

的类型时才显示字符

int 的情况下,它会将您输入的数字读取为数值而不是其 ASCII 值。因此,您只能使用数字作为整数,但是 char 允许您使用任何字符(例如 A、B、C、D | 1,2 ,3,4 | !#%^) 并使用其 ASCII 值。例如4的ASCII值为52,A、*的ASCII值分别为65、42。 注意: 大写字母与小写字母不同(例如 S = 83,而反之 s = 115)。

希望这对您有所帮助。

这是因为隐式类型转换:

Implicit conversions are performed whenever an expression of some type T1 is used in context that does not accept that type, but accepts some other type T2, in particular:

When the expression is used as an operand with an operator that expects T2

在你的例子中

char a;
cin >> a;
cout << a*a; /

运算符 * 需要一个整数类型,所以类型 char 被隐式转换为 int,因此在将 char 转换为 int 时,系统使用 char 对应的 ASCII 值。请在此处查看更多详细信息 http://en.cppreference.com/w/cpp/language/implicit_cast