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
.
请注意,对于编译器而言,char
和 int
是两种不同的类型。它可以区分两者。因此 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
我可能会问一个愚蠢的问题,但我想确认 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
.
请注意,对于编译器而言,char
和 int
是两种不同的类型。它可以区分两者。因此 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