• 深入理解计算机系统(2)


    本文我们要说一说计算机中信息的表示

    一计算机信息的表示

    我们在数学中学习的计算,都是基于十进制的。这种进制,是起源于印度,在12世纪时期流传到阿拉伯,在阿拉伯进行了改进,然后在13世纪传播到西方。这就是我们今天最广泛使用的阿拉伯数字,它包含0~9一共十个符号。

    十进制的特点是,有10个不同的记号,遇到10的整倍数进位。

    在构造存储和处理信息的机器时,不适于使用十进制,而适合使用二进制。它通过一些物质的物理特性,如电压的高或低,通电或者不通电,打孔带的有孔或者无孔等方式来记录信息。

    二进制的特点是,有2个不同的记号,遇到2的整倍数进位。

    这种简单的方式,对于工业制造提供了稳定的基础,现在的工艺,已经可以在一个芯片上集成千万级甚至亿级的电路了。

    但是使用计算机所表示的信息,在进行数学计算时可能并不是那么精确。

    首先计算机的数值计算是有范围的,超出范围就可能得到错误的结果;

    其次计算机的计算是有精度限制的,超出精度就会出现误差;

    最后计算机的计算并不符合某些数学定律。

    因此我们要从计算机信息的存储入手,理解计算机的信息存储特点,以避免出现错误的计算。

    二信息存储

    为了计算机信息表示的方便,还经常使用八进制,十六进制。

    十六进制的特点是,有16个不同的记号,遇到16的整倍数进位。

    十六进制的符号,除了十进制的0~9之外,还包含,a,b,c,d,e,f等字符。每个字符,对应四位bit,例如十六进制的0Xf,用二进制表示,就是1111。即十进制的15。

    我们在安装windows系统时,要分32位,64位。有些软件,也分32位,64位。那这个“位”到底是什么意思呢?

    相对于32位技术而言,64位技术的这个位数指的是CPU GPRs(General-Purpose Registers,通用寄存器)的数据宽度为64位,64位指令集就是运行64位数据的指令,也就是说处理器一次可以运行64bit数据。

    如果CPU是64位的,但是操作系统是32位的,那CPU的的性能就无法充分发挥出来,最直观的感觉就是,安装32位系统比64位系统还慢。当然这还要其他的硬件满足安装64位系统的基本要求。

    32位和64位的系统,对于我们日常应用来说,32位系统,只能识别大概4G的虚拟地址空间,系统实际上可用内存为3.25G。而64位系统,理论上可以支持2的64次方的虚拟地址空间,但目前的系统最大支持128G的内存,而目前主流主板,一般支持到32G的内存。

     

    这是我工作中用到的一台PC Server的配置。使用的是64位cpu,64位的系统,以及32G的内存。

    在这里,我们需明确一个概念,就是机器字长:

    32位系统,一个机器字长度是32bit;

    64位系统,一个机器字长度是64bit。

    对于C语言而言,每种数据都有其特定的类型,但数据本身都是由0,1组成的bit序列,那类型是怎么区分出来的呢?

    其实不同的数据类型,除了上下文之外,只在长度上有区分。

    下面列表列出了,C常见数值类型占用几个字符

    C声明

    32位系统(字符)

    64位系统(字符)

    Char

    1

    1

    Short int

    2

    2

    Int

    4

    4

    Long int

    4

    8

    Char*

    4

    8

    Float

    4

    4

    double

    8

    8

    注意指针类型,无论指向的是什么具体类型,都占一个机器字长。

    对于超过1个字符长度的数据类型,机器在实际存储的时候,有两种方式:

    一种是小端法,一种是大端法。

    所谓小端法,就是指这个数据的最低内存位置存储的是低有效位。

    而大端法,就是表示这个数据的最低内存位置存储的是高有效位。

    如果我们想让计算机存储一个字符串,需要对数据进行编码。编码的方式,最常用的,是用于表示英语字符的ASCII编码,

    此外,还有一种比较通用的编码,就是Unicode编码。它的每个字符占16bit,即2个字节。它可以表示除英语之外很多国家的语言字符。

    Java和.NET都是采用的这种字符集来编码的。

    以前我们说过关于hello world程序的二进制表示。其实对于不同的机器,其二进制也是不同的,而且无法兼容。

    因此如果想用一种语言进行程序编写,然后在不同架构不同系统的计算机上运行,就需要进行特殊处理。例如Java的JVM,就是可以将Java代码根据不同的机器架构编译成对应的机器代码序列。从而实现Java的“一次编译,到处运行”的跨平台性。

    说完了数值和字符,下面说一说关于二进制的数学特性。

    计算机存储数据是使用二进制,它与数学中的“布尔代数”非常相似。在布尔代数中,只有2个值:true或false。而计算机语言中,一般都包含一种称为Bool的数据类型。研究这种数据类型,对于我们学习计算机的存储和运算是有帮助的。

    下图列出bool类型的一些数学特点。

     

    在C语言中,对于数据可以进行如下三种布尔运算:

    1按位布尔运算。

    2逻辑运算与短路逻辑运算。

    3移位运算:左位移运算,逻辑右位移运算,算术右位移运算。

    这些运算在现在高级计算机语言中基本都有,其基本规则与C语言都基本是一致的。

    三总结

    本节主要讲了计算机的信息存储的形式,以及一些基本的运算特性。

    计算机将信息编码为bit位的序列。有不同的编码方式用来表示整数,实数和字符串。不同架构的计算机在编码数字和多字节数据时所产生的bit序列是不同的。

    布尔运算是计算机中的重要运算方式。

  • 相关阅读:
    海尔大数据精准营销平台(内部资料)
    马化腾做的PPT:产品设计与用户体验
    网站上线后,第一次完成线上线下整个环节
    灵感不断
    redis命令
    Redis持久化实践及灾难恢复模拟
    [转]创业公司常见的25个法律问题
    用python语言编写网络爬虫
    Python3常用网络编程模块介绍
    Python3数据库模块(sqlite3,SQLite3)
  • 原文地址:https://www.cnblogs.com/asenyang/p/5496008.html
Copyright © 2020-2023  润新知