zoukankan      html  css  js  c++  java
  • 【深入理解计算机系统】_2_计算机系统中的信息表示

    【字符编码】

      在计算机系统中,所有的数据都经过编码进行处理。在计算机中有多种编码方式,最常见的有:

         1、无符号编码: 基于二进制的编码,表示大于0或者等于0的数字

      2、二进制补码:表示有符号整数的最常见形式。 可以表示负数、0、正数

      3、浮点数编码:以2为基的表示实数的科学计数法;

       浮点数的可以这么认为:  尾数*2^幂;  通过这个表达式我们可以基本看到浮点数在计算机中的存储模式。

    例如:在C语言中float型实数,

         Bit15.....bit9      bit8......bit0

           bit15-bit9可以用来表示尾数,而Bit8....Bit0则可以表示2的幂次,然后通过系统换算就可以将这样表示的

    浮点数换算成十进制的浮点数,   【Float x】bin——>【Float x】dec

    【编码的属性】

      设计一种编码系统必须要实现各种属性: 

        1、表示的值域

               2、算数运算的属性,或者说可以实施的操作

        3、系统中的位级的表示,也就是存储模式

    【进制】

      常见的有二进制、十进制、八进制、十六进制;日常生活中多用十进制,计算机系统多用二进制和十六进制。

    【字】

      在计算机系统中,用字长表示整数和指针的标称大小;通常全字长与数据总线和地址总线有关。  

      字长为n的计算机可以访问的地址空间为0——2^n-1,程序最多可以访问2^n字节。

    注:

      我记得在学习微机原理的时候,里面说到字长的概念,如下所示:

                 书名:微型计算机原理与接口技术(第三版)周荷琴 中国科学技术大学出版社

      而我看《深入理解计算机系统》则是这么说的:

      

                书名:《计算机_深入理解计算机系统].(美)Randal.E.Bryant&Davic.O.Hallaron.扫描版》

      这个地方就让我迷惑了,因为这两个概念风马牛不相及,那么我们该怎么看呢?

      直接看上下文吧。

    【数据类型大小】

      short  int: 一般系统两个字节

      int:一般是四字节,

      long  int:一般取全字长,也就是说sizeof(long int)一般是与表示系统地址线的宽度相同;这个也与OS的设计或者编译器的设计有关

      float:一般是四个字节

      double:一般是八个字节,双精度

      char *:全字长

      C标准对各个数据类型的下界做了规定,但是没有对上界做规定;一般要求int的范围不比short int小,long int不比int范围小。

    【寻址和字节顺序】

      对于程序里访问的对象,我们需要关注的有:存储对象的地址、多字节对象的字节顺序以及存储的内容;单字节一般关注存储地址和存储的内容即可;

    例如对于char型数据对象,我们一般关注数据对象的地址和内容即可,不需要关注对象字节的存储方式。

      多字节对象一般按照下面方式处理:存储为连续的字节序列, 多字节中对应的最小地址为对象的地址。

      例如我们有int(32位)型数据对象:

      int  nTest;

       则nTest占用4个字节,如下图:

                                        

      数据对象nTest占用连续的字节0x100、0x101、0x103、0x104,且其地址为0x100.

      说到这个地方我们不能不说的一个计算机中基本的概念:小端和大端。

      假设我们有一个占用W位的对象,用二进制表示为【Xw-1,Xw-2,Xw-3.......X3,X2,X1,X0】,W为八的倍数,那么在存储的过程中,这些位就

    被分成字节组,每8位为一组,【Xw-1,Xw-2,Xw-3......Xw-8】为最高有效的8位MSB,而【X7.....X2,X1】为最低有效的8位LSB,由于计算机的

    存储基本单元室字节(8位),这样存储MSB、LSB等其他位就会有一个前后顺序,可能有两种可能。如下图所示:

      小端:用十六进制表示时,权值大的部分放在地址的高端部分,就是如上图的方式2

      大端:用十六进制表示时,权值大的部分放在地址的低端部分,如上图的方式1;大端表示法与自然数字表示相同,即数字在计算机中的存储按照

    习惯书写方式的方向存储。

      大端和小端一般不影响程序的读写和显示,但是在字节块通信的时候,会影响发送和接受方解释数值的大小;同时当使用强制类型转换后的字节

    的读取。

      例如:0xFBCA_13B4

      其小端存储模式存储形式为:   B4   13   CA   FB

       大端存储模式存储形式为:   FB   CA   13   B4

      目前大多数的IBM、Motorola和Sun Microsystem采用的是大端存储法,而Intel的以及PC兼容微机采用的小端法;而且有些计算机可以工作

    在大端和小端,具体工作在什么模式则取决于系统加电时规定的存储规则。

    【字符串】

      在C语言标准中字符串是连续字符序列,并且字符序列的最后是空字符'\0',字符串的长度不包括最后的控制符'\0';在很多时候用null表示'\0';

    为了这样表示可以定义一个宏:

        #define    null   ('\0')   //这里需要注意NULL和null具有不同的性质,虽然在数值上是相等的

      特别地定义:

        #define   NULL  ((void *)0)  //这里0具有指针的特性

      字符串从技术上可以看作是字符数组,其在计算机中是连续存储的,存储区域的最低地址存储的是字符串的首字符。

      最常见的字符编码方式是ASCII编码方式。

      Tip:   十进制的0、1、2......9,正好对应十六进制的编码的0x30、0x31.....0x39; 即数字0的ASCII码值为(48)dec。

      字符串用双引号引用,例如:字符串"abc"、空字符串"";

      字符串支持连接,例如:  "abcdefg""hijk" 则表示字符串"abcdefghijk"

      字符串本身返回其存储首地址;例如char*  strTest="abc"; 则我们可以利用strTest引用字符内的字符以及字符串。

    ---恢复内容结束---

  • 相关阅读:
    Linux反编译
    函数调用 堆栈
    机器学习经典书籍
    linux kernel系列四:嵌入式系统中的文件系统以及MTD
    Linux Kernel系列三:Kernel编译和链接中的linker script语法详解
    单页面响应式模板:血色圆月
    Disqus评论框改造工程-Jekyll等静态博客实现Disqus代理访问
    25个Web前端开发工程师必看的国外大牛和酷站
    我们是谁? 程序员!
    GitHub万星项目:黑客成长技术清单
  • 原文地址:https://www.cnblogs.com/volcanol/p/3019145.html
Copyright © 2011-2022 走看看