原代码 :
输出了右边的符号
所以我们将其强制转换为int后输出才得到我们想要答案。
为什么不转换会是这个结果?
大家有注意到这个语句吗?
j = (i >> x) & 1;
我们可以看到前面的定义j是char型 而i是int型的。我们这样其实就是在强制转换了。
什么是强制转化?
众所周知int型在内存中占4个字节,而char型为1个字节。那么我们强制转换系统要去掉高位的3个字节。
比如进行下列操作
int x=255;
char y=(char)x;
cout << int(y) ;
输出为-1 (255-256)
char型数据的范围是-128~127(256),你可以把他想象成一个圆盘,最上面是0,向右+1,向左-1,最下面是127和-128相邻。当你将一个大于127的正数转换时,可以理解成从零出发绕圈,最终结果就是停留的格子。
同样的如果x为512的话那么会被转化为0。
但在这里我们发现我还是使用了cout << int(y) 才能输出。
我想知道的是为什么一定得 (int)y 才能输出呢?
我发现0与1被转化为了'\0'与'\x1'。
而‘/0’是字符常量,0是整型常量。其中字符常量也可以用转义序列来表示。
什么是转义序列?
在C++里面有两类字符不能直接使用,转义序列和泛化转义序列。
转义序列为\r \n \t \b等之类的(大家可以自己查查)
而我们的问题出现在这其中的泛化的转义序列。
泛化的转义序列的形式有两种:
1.\后紧跟3个八进制数(最多只能3个,超过的算其他字符):
如\12表示换行符,\40表示空格,\124表示大T,\1243则表示T3。
2.\x后面紧跟着1个或多个十六进制数:
如\xa表示换行符,\x20表示空格,\x54表示大T,由于字符只占8位,所以最多只能有两个16进制位,多了会报错。
结论
原来在j = (i >> x) & 1;这个语句中,我们的结果被转化为了'\0' '\x1'这样转义序列,使得我们的输出出现了问题,所以我们需要再次强制转化为int型才能输出我们想要的答案!
如有错误欢迎大家指出,互相学习让我们一起成长!
最后附上ASCII码表方便大家使用(网上找的)
部分资料参考来自
https://blog.csdn.net/qq_50351157/article/details/110499630
(C语言:int型数据向char型数据的强制类型转换原理)
https://blog.csdn.net/weixin_43744293/article/details/116520817
(C++中的转义序列(\r \n \t \b)和泛化转义序列)
#免责声明#
①本站部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责。
②若您需要商业运营或用于其他商业活动,请您购买正版授权并合法使用。
③如果本站有侵犯、不妥之处的资源,请联系我们。将会第一时间解决!
④本站部分内容均由互联网收集整理,仅供大家参考、学习,不存在任何商业目的与商业用途。
⑤本站提供的所有资源仅供参考学习使用,版权归原著所有,禁止下载本站资源参与任何商业和非法行为,请于24小时之内删除!