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
是一种基本数据类型,大小为1字节(不一定是8位!!),能够表示至少所有字符的ASCII码范围。因此,例如,char x = 'a';
实际上存储'a'
的ASCII值,在本例中为97。然而,ostream
运算符是重载的,所以它们"知道"如何处理char
,而不是盲目地在cout << x;
这样的行中显示97
,它们显示字符的ASCII表示,即'a'
。
但是,无论何时执行a * a
,编译器都会执行所谓的整型提升,并隐式地将char
中的数据转换为int
。因此,对于编译器来说,表达式a * a
被翻译成(int)a * (int)a
,这是97 * 97
的结果,所以最终显示的是9409
。
注意,对于编译器char
和int
是两个不同的类型。它可以区分这两者。因此,operator<<
仅在输入类型为char
或可隐式转换为char
的类型时显示字符。
在char
的情况下,它不是二进制被相乘,它是你输入的任何ASCII值。如果是6
,则ASCII值为54
,因此输出2916
。当a
为int
时,直接存储6
,因此输出36
在int的情况下,它将读取您键入的数字作为数值而不是其ASCII值。因此,你只能对整数使用数字,然而char允许你使用任何字符(例如:A,B,C,D | 1,2,3,4 | !#%^),它使用它的ASCII值。例如,4的ASCII值为52,A、*的ASCII值分别为65、42。注意:大写字母和小写字母是不同的(例如S = 83,而反过来S = 115)。
希望这能帮到你。
这是因为隐式类型转换:
当某个类型的表达式存在时,执行隐式转换T1用于不接受该类型但接受某些类型的上下文中其他类型T2,特别是:
当表达式用作操作数时,操作符为预计T2
在你的例子中
char a;
cin >> a;
cout << a*a; /
Operator *需要一个整型,所以类型char
被隐式转换为int
,所以当char转换为int时,系统使用char对应的ASCII值。详见http://en.cppreference.com/w/cpp/language/implicit_cast
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- sdl软件渲染器不工作,工作在硬件加速的一个