zoukankan      html  css  js  c++  java
  • 深入理解计算机系统(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序列是不同的。

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

  • 相关阅读:
    mysql复制那点事
    全排列问题
    56. Merge Interval
    2. Add Two Numbers
    20. Valid Parentheses
    121. Best Time to Buy and Sell Stock
    120. Triangle
    96. Unique Binary Search Trees
    91. Decode Ways
    72. Edit Distance
  • 原文地址:https://www.cnblogs.com/asenyang/p/5496008.html
Copyright © 2011-2022 走看看