欢迎光临散文网 会员登陆 & 注册

C/C++ 从入门到入门 第二章数据类型 第0节 计算机常用基本数制数码简介

2023-04-10 23:58 作者:烤爆米实验室  | 我要投稿

各位, 对于鸽了一事十分抱歉.但是确实是事出有因, 绝不是我偷懒没有做!!

回顾了一下之前的视频内容, 认为对于数据类型部分, 有些东西, 还是应该让大家了解. 就比如本文将要说明的部分.

回顾 2_1 的内容

2_1 的视频里面, 我们安排了一个任务, 借着这个任务, 我们把数据类型中关于指针的部分进行了一笔带过式的介绍, 然后重点说明了数类型和他们的关键字. 整数类型的 int 与相关关键字 short long long long unsigned等和小数类型的 float double `

当时我说, 这些关键字限制了 int 的取值范围. 实际上, 这种说法不准确. 应该是规定了 int 的取值范围或者是限定了认知中int的取值范围.

本文就其原因, 对各位进行说明, 为什么 int 的范围是 -2147483648~2147483647. 怎么限定的.

数制

最开始没有数制这样的词语, 但是数制的概念已经深深的刻进了我们的DNA中. 比如, 人家问你今天吃了吗, 或者你明天想吃大米粥吗.. 可能当时你正在刷牙, 或者是你正在吃东西, 或者是做什么其他的事情, 你的嘴没闲着. 你的反应可能就成了点头摇头, 或者是大拇指, 等动作.

那么点头和摇头的动作, 就包含了两种值. 也就是说在你给出的点头摇头动作给出的两种可能答案中, 只有两种可能值: 是或者否. 而且只能有这两种可能. 不会有第三种可能出现.

扩展一下思路, 现在问你, 你想吃大米粥, 还是小米粥. 你可能会给出三种答案. 大米粥, 小米粥, 都不想. 这三种可能, 大概不会有第四种可能出现.

换个话题. 幼儿园时代, 我们可能学习过珠算. 我们用只有一颗上珠, 四颗下柱的算盘举例. 当你某一个档算盘的下柱全部拨上去的时候, 想要再做加一操作, 那么是把上珠拨下来一位, 下珠归零. 此时计数"五".

当计数达到"九"时, 想要再加一, 操作是当前档的数值归零, 然后其左侧档加1操作.

于是就有了数制的概念: 数制含有两种属性, 其一是规定这一位的符号. 其二规定了进位规则.

一般情况下, 默认只规定进位规则, 这一位符号形式遵照习惯或者遵照国际惯例. 通常称为 X 进制.

早期计算机是有考虑采用10进制的方式的. 比如做一个电磁控制的多路开关等操作, 当输入的电压在某一个档位之间, 则开关调整到某个位置表示0~9中的某个值. 但是这种计算机的稳定性极差, 索性, 只考虑两种可能值. 低电压, 高电压. 十分方便.

这就是为什么计算机普遍采用二进制. 原因就是他方便. 为什么人类普遍采用十进制. 因为一般人一共偶10个手指头. 不过也有采用五进制的情况, 比如我们唱票计票数的时候.

数码

已知二进制了, 那就是只有两个符号 0 和 1, 当前位是 1 的时候, 再加一操作就要在上一位加一, 当前为变为0. 即 1 + 1 = 10.

已经解决了计算机表示数值的方法. 接下来是一个因为客观条件限制的问题.

计算机的存储能力不强. 不能存储无限大的数. 所以合理分配空间就显得十分有必要.

于是科学家们根据流行的计算机的存储情况, 在具体的编程语言上为数据类型涉及了他能够限定的位数.

比如 short规定是16位, long是32位, long long 是 64 位

同时, 为 int提供了多种选择, 其宽度可以为16 32 甚至可能是64位.只不过, 目前的主流机器和操作系统上, int 的位数是32位于 long 相同.

现在各位应该就能够理解为什么不同的关键字会规定取值范围了吗?

要求你现在表示一下 - 12 这个数. 不难, 不就是 - 1100 吗.

确实, 那么灵魂问题出现了. 如何表示 - 这个符号?

你说, 这有什么难的, 不就是 ... 等下.

可能发现问题了.

计算机怎么表示这个 - 符号的.

为了解决类似这样的问题. 科学家们研究出数码方法. 以下是针对整数的常见的数码方法.

说明, 以下整数数码均限定共8位编码 0000 0000 .为了好计数, 不连起来, 每四位做一个空格隔断. 从左起的位表示为高位, 从右起的称为低位

原码

高1位表示数符 s , 代表. 接下来的7位, 表示数值. 数值部分, 缺位从高位补0.

比如, 表示-3 的原码. 则是1000 0011

反码

正数的反码于原码完全相同. 负数部分的符号位不变, 所有的数值位, 每一位都按位取反(1变成0, 0变成1)

这里特别注意, 0 在反码中比较特殊, 正0 是所有位全是0, 负0是所有位全是1

补码

正数的补码和原码完全相同. 负数的补码在其反码的基础上再加1. 比如:

%0A%0A%0A3_%7B10%7D%3D%200000%5C%200011_%7B2%7D%5C%5C%0A-3_%7B10%7D%3D%201000%5C%200011_%7B2%7D%5C%5C%0A%E6%8C%89%E4%BD%8D%E5%8F%96%E5%8F%8D%5Cto1111%5C%201100_%7B2%7D%5C%5C%0A%E6%9C%AB%E4%BD%8D%E5%8A%A01%5Cto1111%5C%201101_%7B2%7D%0A%0A%0A这种计算有个好处, 就是计算机不必再设计减法运算器了, 各位可以自己试试计算 3-2的操作时候, 转换成然后再将3 和-2转化为补码计算.

对于补码来说, 没有 + 0 和 -0 的区别, 各位也可以自行尝试 -0 的补码和 + 0 的补码.

补码计数方式, 是目前主流的有符号整数计数方式.

所以对于一个 long int  来说, 他的存储位数是32位,  去掉一个符号位, 数值位还有31位. 计算 得到

2,147,483,648 个数来处理非负的部分, 就是 0 ~2147483647. 同样是这些数来处理负数部分, 就是-2147483648~-1.  闭区间.

unsigned

这个标志的意思就是, 没有符号位了, 所有的位数全部用来表示数值. 这样就相当于long int 正数最大值

4,294,967,296 - 1  = 4,294,967,295 是 2147483648 *2 -1; 其他关键字加上 unsigned 的效果亦如此.

好, 以上就是关于偏向计算机基础知识的一些简介. 希望可以帮助大家, 正片的2_2 部分将描述字符串数据类型, 同时介绍 printf 函数和 scanf 函数, 依然是文本内容. 感谢各位的支持.

C/C++ 从入门到入门 第二章数据类型 第0节 计算机常用基本数制数码简介的评论 (共 条)

分享到微博请遵守国家法律