C++中char类型是存什么的?
#include<iostream>#include<string>usingnamespacestd;intmain(){charcone=1;charctwo=2;c...
#include <iostream>
#include <string>
using namespace std;
int main(){
char cone = 1;
char ctwo = 2;
char cthree = 0;
cthree = cone + ctwo;
cout << cthree << endl;//怎么没有输出3,而输出的是个心字?
//什么是ASCII码?
}
问题不是要输出三,而是说他的原理.我想知道的是这个.
幻の上帝 你好,你讲得很好了,但有一点没有明白,为什么单字节的char类型变量能存储int类型的值呀,没懂,庥烦你再讲下谢谢!! 展开
#include <string>
using namespace std;
int main(){
char cone = 1;
char ctwo = 2;
char cthree = 0;
cthree = cone + ctwo;
cout << cthree << endl;//怎么没有输出3,而输出的是个心字?
//什么是ASCII码?
}
问题不是要输出三,而是说他的原理.我想知道的是这个.
幻の上帝 你好,你讲得很好了,但有一点没有明白,为什么单字节的char类型变量能存储int类型的值呀,没懂,庥烦你再讲下谢谢!! 展开
6个回答
展开全部
char是单字节字符类型,因此占8个二进制位。计算机中字符一般用整数表示,不同的整数表示不同的字符,具体的表示方案称为(内码)编码方案。ANSI/ASCII是美国国家标准的7位编码,取值为0~127,对应于char的低7位。
对于cone、ctwo、cthree而言,初始化时隐式地把1、2、0这些无后缀的整数字面量(类型为int)经过类型转换储存至这些char变量中。char到int(32位平台上为4字节)的类型转换没有损失精度,因此只是在高位补0,cone、ctwo、cthree存储的还是整数1、2、0。cthree=cone+ctwo被计算之后,cthree储存的整数等于3。
但对于cout而言,<<之后的操作数cthree本身是一个char类型的表达式,于是编译器选择了接受char类型的参数重载版本的<<操作符,这个操作符的内部实现中把参数作为ASCII字符处理,输出对应的字符。ASCII编码为3的字符不是可打印字符,而是控制字符,输出的内容不确定,具体图案由平台决定。
如果要输出数字,那么结果转换为int等能被cout作为数来处理的类型就行了,例如:
cout << (int)cthree << endl; //C风格转换;
cout << int(cthree) << endl; //利用基本类型构造函数的C++风格转换;
cout << static_cast<int>(cthree) << endl; //C++风格的静态转换;
cout << reinterpret_cast<int>(cthree) << endl; //C++风格的直接转换;
当然,更好的做法是,不要用char保存用来作整数运算的数,以免语义的模糊。
顺便, 猪头或火宝宝 错误,'1'的ASCII为49,'2'的ASCII为50,加法的结果为99,对应的ASCII字符是'c',不会输出字符'3'。事实上,'0'到'9'这几个字符的ASCII是连续的,对应于整数0x30(十进制48)到0x39,'3'是0x33即十进制的51,因此 Player1005 的 cthree + 0x30(这里也就是3 + 48)和sky_baofish 的 '1'+2 都能得到预期结果'3'。
----
↑2010-7-25 14:34
----
char类型是字符类型,同时可以参与算术运算(表示一个单字节能存放的下的整数)。C中原本存在两种单字节整数——unsigned char,范围是[0, 256);signed char,范围是[-128, 128)。除了算术运算外,这两种类型之一被利用存储ASCII字符(因为只用低7位,所以存储字符的效果都一样):有些平台使用unsigned char,有些平台使用signed char。为了统一起见,ANSI C89引入了char类型专门表示字符类型(在C++中也保留了这个特性)。但为了和标准制定之前的源代码兼容,规定char类型参加算术运算的行为和unsigned char和signed char其中一个相同,而具体是哪一个,由平台决定。并且,char、unsigned char和signed char是三种不同的类型(尽管由于上面的规定某两种类型的算术运算特性完全相同)。
为了明确整数的范围,一般char专用于存储字符,而单字节整数用signed char和unsigned char来表示。不过对于整数区间[0,128)之内的运算,用char还是安全的。
char变量不一定能够完整地存储int类型的值。但是,一个整数足够小,就可能一个被char变量安全地表示——此时这个整数值复制给char的时候不会有问题。当超出char的保存范围时,一般的实现中会发生截断,char中会保留最低或最高8位的值(这个又是平台相关的,有兴趣的话可以搜索“字节序”)。显然这不是算术运算中期望的结果,所以如果字面量复制给char或其它整数时超过被赋值/初始化对象的表示范围,编译器至少会产生一个警告。不过运行期范围检查编译器是做不到的,所以退一步,编译时检查类型,对于可能会损失精度的类型(例如int变量到char变量)对象之间的赋值/初始化,编译器产生警告或错误。
====
[原创回答团]
对于cone、ctwo、cthree而言,初始化时隐式地把1、2、0这些无后缀的整数字面量(类型为int)经过类型转换储存至这些char变量中。char到int(32位平台上为4字节)的类型转换没有损失精度,因此只是在高位补0,cone、ctwo、cthree存储的还是整数1、2、0。cthree=cone+ctwo被计算之后,cthree储存的整数等于3。
但对于cout而言,<<之后的操作数cthree本身是一个char类型的表达式,于是编译器选择了接受char类型的参数重载版本的<<操作符,这个操作符的内部实现中把参数作为ASCII字符处理,输出对应的字符。ASCII编码为3的字符不是可打印字符,而是控制字符,输出的内容不确定,具体图案由平台决定。
如果要输出数字,那么结果转换为int等能被cout作为数来处理的类型就行了,例如:
cout << (int)cthree << endl; //C风格转换;
cout << int(cthree) << endl; //利用基本类型构造函数的C++风格转换;
cout << static_cast<int>(cthree) << endl; //C++风格的静态转换;
cout << reinterpret_cast<int>(cthree) << endl; //C++风格的直接转换;
当然,更好的做法是,不要用char保存用来作整数运算的数,以免语义的模糊。
顺便, 猪头或火宝宝 错误,'1'的ASCII为49,'2'的ASCII为50,加法的结果为99,对应的ASCII字符是'c',不会输出字符'3'。事实上,'0'到'9'这几个字符的ASCII是连续的,对应于整数0x30(十进制48)到0x39,'3'是0x33即十进制的51,因此 Player1005 的 cthree + 0x30(这里也就是3 + 48)和sky_baofish 的 '1'+2 都能得到预期结果'3'。
----
↑2010-7-25 14:34
----
char类型是字符类型,同时可以参与算术运算(表示一个单字节能存放的下的整数)。C中原本存在两种单字节整数——unsigned char,范围是[0, 256);signed char,范围是[-128, 128)。除了算术运算外,这两种类型之一被利用存储ASCII字符(因为只用低7位,所以存储字符的效果都一样):有些平台使用unsigned char,有些平台使用signed char。为了统一起见,ANSI C89引入了char类型专门表示字符类型(在C++中也保留了这个特性)。但为了和标准制定之前的源代码兼容,规定char类型参加算术运算的行为和unsigned char和signed char其中一个相同,而具体是哪一个,由平台决定。并且,char、unsigned char和signed char是三种不同的类型(尽管由于上面的规定某两种类型的算术运算特性完全相同)。
为了明确整数的范围,一般char专用于存储字符,而单字节整数用signed char和unsigned char来表示。不过对于整数区间[0,128)之内的运算,用char还是安全的。
char变量不一定能够完整地存储int类型的值。但是,一个整数足够小,就可能一个被char变量安全地表示——此时这个整数值复制给char的时候不会有问题。当超出char的保存范围时,一般的实现中会发生截断,char中会保留最低或最高8位的值(这个又是平台相关的,有兴趣的话可以搜索“字节序”)。显然这不是算术运算中期望的结果,所以如果字面量复制给char或其它整数时超过被赋值/初始化对象的表示范围,编译器至少会产生一个警告。不过运行期范围检查编译器是做不到的,所以退一步,编译时检查类型,对于可能会损失精度的类型(例如int变量到char变量)对象之间的赋值/初始化,编译器产生警告或错误。
====
[原创回答团]
参考资料: 原创
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询