【深入理解计算机系统】_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引用字符内的字符以及字符串。

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

原文地址:https://www.cnblogs.com/volcanol/p/3019145.html