IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: 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语言二进制序列的取值范围

? 今天来探讨一个问题,首先题目是这段代码,让我们说出运行的结果:

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

int main()
{
char a[1000];
int i;
for(i = 0; i < 1000; i++)
    {
    a[i] = -1 - i;
    }
    printf("%d", strlen(a));

return 0;

? 我们知道这里是先创建了一个字符数组,给到的是随机值初始化,那么我们就画图示意:

? 当数组创建好之后,根据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语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-11-28 11:05:10  更:2021-11-28 11:06:48 
 
开发: 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-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码