C++ 输出char问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++ 输出char问题相关的知识,希望对你有一定的参考价值。
C++ 输出char问题cout<< ('A'+'C')/2<<endl; //把A C转为ASCII码,输出66
cout<<static_case<char>( ('A'+'C')/2)<<endl; //为什麼会输出-62 而不是B?
如果你写的是
cout<<static_case<char>('A'+'C')/2<<endl;
输出-62我并不觉得奇怪。
因为
'A'的ascii码是65,'C'是67。相加是132。
'A'+'C'的“结果类型”是int,因此它的十六进制是0x00000084,最高位是0表示正数!(你可以求sizeof('A'+'C')验证一下,是4,int的大小)
3. static_case<char>('A'+'C')相当于static_case<char>(132)。
4. (char)132的十六进制是0x84,二进制是1000 0100,最高位符号位是1表示这是个负数!
5. 用8位补码解析0x84,得到的结果是-62!
用下面的告诉你结果:
#include <iostream>using namespace std;
int main()
cout << "('A'+'C') = " << ('A' + 'C') ;
printf(" = 0x%08x\\n", ('A' + 'C'));
cout << "(int)(char)('A'+'C') = " << (int)(char)('A' + 'C');
printf(" = 0x%08x\\n", (int)(char)('A' + 'C'));
return 1;
/*
输出:
('A'+'C') = 132 = 0x00000084
(int)(char)('A'+'C') = -124 = 0xffffff84
*/
最后再补充一句,为了不让'A'+'C'的结果“溢出”,导致char('A'+'C')/2得到负数,更好的办法是char('A') + char('C'-'A')/2。
这两种做法虽然数学上是等价的,但是第一种方法的“中间计算过程”存在“溢出”,导致结果不是想要的。
PS:第二种做法在做二分查找和快速排序的时候也都会用到!
参考技术A cout<<(char)(('A'+'C')/2)<<endl; 参考技术B 我这输出B,也许就是你编译器有bug追问你用什麼编译器?我在Mac Xcode 和一些网上编译器都不行
追答VC
为何在c++中要将一个char型的变量以数的形式输出需要将其强制转换成int 型的,而单片机中不用
为何在c++中要将一个char型的变量以数的形式输出,需要将其强制转换成int 型的,而单片机中不用(即char型的数出来就是一个数)
任何变量在内存中的存储都是二进制数。在输出的时候,
c++中,cout<< 输出一个char型变量默认就是字符串。要输出数字需要强制转换。
在c中,printf,是格式化输出,对于一个char型变量,%c输出字符串,%d输出其ascii码值,不需要强制转换。追问
printf在c++中可以使用吗
追答因为c++兼容c,所以可以使用,但不建议使用。
追问如果要使用,是否要加什么header?
追答和C一样吧,#include
参考技术A 如果用cout输出需要转换, 用printf不用的.因为cout会自己判断变量的类型, 然后根据类型来决定如何输出
以上是关于C++ 输出char问题的主要内容,如果未能解决你的问题,请参考以下文章
C++实现string输出char的二进制 && string按二进制位转char类型