C++ 中转二进制时发现一个很有趣的现象

原代码 :

C++ 中转二进制时发现一个很有趣的现象

输出了右边的符号

所以我们将其强制转换为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码表方便大家使用(网上找的)

        C++ 中转二进制时发现一个很有趣的现象

        部分资料参考来自

        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小时之内删除!

        给TA打赏
        共{{data.count}}人
        人已打赏
        数码硬件

        电子科技、电动车崛起!日媒:现在是世界离了中国人才就不能转

        2023-3-22 0:00:00

        数码硬件

        7900XTX超频3.2G功耗很低;i卡驱动砍半;NVIDIA取消视频编码限制

        2023-3-24 0:00:00

        0 条回复 A文章作者 M管理员
          暂无讨论,说说你的看法吧
        个人中心
        购物车
        优惠劵
        今日签到
        有新私信 私信列表
        搜索