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++

使用标准C++库,宽字符wchar如何转char递增输出?

char数组的C++向量

C++实现string输出char的二进制 && string按二进制位转char类型

c++中,如果cout 或者cin char类型的数组名,指针,都会把字符串输出,而不是输出地址,

C++实现string输出char的二进制 && string按二进制位转char类型