C++ 输出char问题

C++输出char问题cout<<('A'+'C')/2<<endl;//把AC转为ASCII码,输出66cout<<static_case<char>(('A'+'C'... C++ 输出char问题cout<< ('A'+'C')/2<<endl; //把A C转为ASCII码,输出66
cout<<static_case<char>( ('A'+'C')/2)<<endl; //为什麼会输出-62 而不是B?
展开
 我来答
百度网友e096309
2017-03-19 · TA获得超过1327个赞
知道小有建树答主
回答量:501
采纳率:96%
帮助的人:415万
展开全部

如果你写的是

cout<<static_case<char>('A'+'C')/2<<endl; 

输出-62我并不觉得奇怪。

因为

  1. 'A'的ascii码是65,'C'是67。相加是132。

  2. '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:第二种做法在做二分查找和快速排序的时候也都会用到!

百度网友2018359
2017-03-19 · TA获得超过3494个赞
知道大有可为答主
回答量:3486
采纳率:73%
帮助的人:1435万
展开全部
cout<<(char)(('A'+'C')/2)<<endl;
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
arongustc
科技发烧友

2017-03-19 · 智能家居/数码/手机/智能家电产品都懂点
知道大有可为答主
回答量:2.3万
采纳率:66%
帮助的人:5998万
展开全部
我这输出B,也许就是你编译器有bug
追问
你用什麼编译器?我在Mac Xcode 和一些网上编译器都不行
追答
VC
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式