| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 讨论C语言二进制序列的取值范围 -> 正文阅读 |
|
[C++知识库]讨论C语言二进制序列的取值范围 |
? 今天来探讨一个问题,首先题目是这段代码,让我们说出运行的结果:
? 我们知道这里是先创建了一个字符数组,给到的是随机值初始化,那么我们就画图示意: ? 当数组创建好之后,根据for循环里面的表达式我们可以得出下标由0开始的元素里面分别放的是 -1、-2、-3以此类推,那么后面放的是什么呢,我们暂时不知道,但是可以告诉大家最后面放的元素不一定是 -1000,现在就开始探讨一下。 ? 我们知道每一个元素是char类型,那么我们就来研究一下,一个char类型的变量中到底能放什么数值。 ? 根据大家所知道的知识点,如果是一个signed char,那么它是拥有1byte(一个字节),也就是8bit(8个比特位),而对于一个unsigned char亦是如此。那么8个比特位无非就是可以放进去一个8个二进制位的数,那么大概列出所有可能就是像下图这样: ? 这就是8个二进制位里面能够放的二进制序列的可能性,从8个全0最终会变成8个全1。 ? 我们知道上面这个序列如果放入内存的话,那么放的全部都是补码,那么现在就来探讨一下内存中unsigned char所对应的原码是什么。 ? 假设内存中存的是右边这个序列,那么他们每一个序列的最高位并不是符号位,因为这是个无符号序列,这里面的二进制位都是有效位,那么他们的补码即是原码,翻译过来就是: ? 所以用char类型截断后,它里面能放下数字的空间就是0~255之间。 ? 那么如果大家理解了这个之后,我们接下来再来讨论下有符号类型的情况: 和无符号类型的区别就是,他们的最高位是符号位,那么最高位是0的序列,其对应的原码、反码和补码都相同,翻译出来就是: ? 按照相关的原码、反码和补码换算,就像图中右边的范围所示(注意这里的10000000序列在计算机中直接会被解析为-128),所以一个有符号数的取值范围是 -128~127。 ? 讲到这里我们会发现,如果在内存中给127进1的话,会直接变成-128,给-128再加1的话,会变成-127,以此类推下去,如果加到-1对应的二进制序列的时候,加1,那么就会直接变成0所对应的二进制序列,也就是8个比特位全为0,所以大家可以发现这是一个循环!那么这里就再给大家画一个图方便理解一下: ? 因为这样让二进制序列不断的进1循环,我们不妨把图画成一个圆环,并且切割成两半,由12点钟方向开始顺时针放入二进制序列,首先放的是00000000,也就是由0所对应的二进制序列开始(8个比特位),那么第二个放的序列就是00000001,二进制序列在不断的加1,对应的数就是由0开始到127结束,到现在对应的正数都写完了。 ? 那么此时让127再涨1的话,按照刚才上面所知道的知识点,其二进制序列就会变成10000000,也就是-128,此时再涨1,序列就变成10000001,类推下去,二进制序列会随着圆环每次加1下去,最终回到12点钟方向,序列变成11111111,对应的不就是-1吗,如下图所示: ? 所以我们可以发现不断地给这里的二进制序列涨1,这个圆环会转起来,不断地循环,顺时针就是让二进制序列加1,那么对应地减1就是逆时针方向了。 ? 那知道了这个知识点后,我们可以推引一下,一个有符号位的char取值范围是-128~127。那么一个有符号的short(16个比特位)按照刚才的思考方式,我们也可以把它们的二进制序列的可能性列出来,如下图: ? 因为其最高位是符号位,所以肯定也是从负数到正数的一个范围,最终求出来就是-32768~32767这个取值范围,再推引一下,同样我们可以推出有符号int的取值范围,这里就不多赘述了,大家了解就好! ? 当我们理解到这些知识点猴,那么言归正传,回到刚才的题目,如果从第一个元素开始一直减1下去,最终减到最小的负数就是-128,此时再减1的话,根据刚才的圆环,就会逆时针继续走,变成127,最后会变成0,那么0再减1的话又会循环回去从-1开始,到-2、-3...以此类推往后走,如图所示: 那么如果这样走下去,我们字符数组的1000个元素肯定都会被初始化好了,那么接下来程序要我们打印的是strlen(a),strlen是让我们求字符串长度,求字符串长度最关注的是什么呢?我们知道是关注'\0',因为找到'\0'即代表找到末尾的位置,那么'\0'对应的ASCII值是0,所以我们只要在这个字符数组里面找到0即可,那么刚才数组遇到第一个0的位置就是在下图所示的绿色箭头位置: ? -1到-128之间有128个元素,127到1之间有127个元素,那么strlen统计的是0之前出现了多少个字符,那127加128就是255,所以最终求出来的长度就是255,此时程序运行打印出来的就是255。 |
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 9:19:03- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |