第二章信息的处理和表示(1.信息存储)

概述

现代计算机存储和处理信息以二值信号表示。这些二进制数字形成了数字革命的基础

二值信号能够容易地被表示、存储和传输,例如穿孔卡片上有洞或无洞、导线上的高低电压、磁场的顺时针或逆时针

三种最重要的数字表示:
	1. 无符号编码基于传统的二进制表示法,表示大于或者等于零的数字
	2. 补码的编码是表示有符号整数的最常见的方法,有符号整数就是可以为正或为负的数字
	3. 浮点数编码是表示实数的科学计数法的以2为基数的版本

计算机表示法是用一个有限数量的位来对一个数字进行编码,因此,当结果太大,会导致溢出(overflow)

整数的表示虽然只能编码一个相对较小的数值范围,但是这种表示是精确的
浮点数虽然可以编码一个较大的数值范围,但是这种表示只是近似的

1.信息存储

字节(8位):是最小的可寻址的内存单位,而不是访问内存中单独的位。机器级的程序将内存视为一个非常大的字节数组,称为虚拟内存。内存的每个字节都由一个唯一的数字来标识,称为它的地址,所有可能的地址集合就称为虚拟地址空间

C语言中指针的作用
指针是C语言中一个重要的特性。它提供了引用数据结构(包括数组)的元素的机制。与变量类似,指针也有两个方面:值和类型。它的值表示某个对象的位置,它的类型表示在那个位置上所存储对象的类型

  1. 十六进制表示法(一个字节由8位组成)

    1. 二进制表示(2为基数):值域:00000000 ~11111111
    2. 十进制表示(10为基数):值域:0~255
    3. 16进制(hex)表示(16为基数):值域:00~FF
      在这里插入图片描述

    十六进制与二进制转换:

     1. 十六进制转二进制(展开每个16进制数)
     	16进制数字0x173A4C
     	十六进制      1     7     3     A     4     C
     	二进制     0001  0111  0011  1010  0100  1100
     2. 二进制转十六进制
     	(将它分为每4位一组来转换为16进制,如果位总数不是4的倍数,最左边的一组可以少于四位,前面用0补足)
     	一个二进制数1111001010110110110011
     	二进制       11  1100  1010  1101  1011  0011
     	十六进制      3     C     A     D     B     3
    
  2. 字数据大小

    1. 字长,指明指针数据的标称大小。因为虚拟地址是以一个字来编码的,所以字长决定的最重要的系统参数就是虚拟地址空间的最大的大小。对于一位字长位w位的机器而言,虚拟地址的范围是0~2w-1,程序最多访问2w个字节

    2. 大多数64位机器也可以运行32位机器编译的程序,这是向后兼容。

      1. Linux> gcc -m32 prog.c 该程序可以在32位或64位机器上运行
      2. Linux> gcc -m64 prog.c 该程序只可以在64位机器上运行

       
       称程序位"32位程序"或"64位程序"时,区别在于该程序是如何编译的,而不是其运行的机器类型
          在这里插入图片描述
           数据类型 long 一般在32位程序中为4字节,在64位程序中为8字节

      1. 为了避免由于依赖"典型"大小和不同的编译器设置带来的奇怪行为,ISC C99引入了一类的数据类型,其数据的大小是固定的,不随编译器和机器的设置而变化。
      2. 大部分数据类型都编码为有符号数值,除非前缀有关键字unsigned或对确定大小的数据使用了特定的无符号声明

       
      声明指针
        对于任何数据类型T,声明 T * p,声明p是一个指针变量,指向一个类型为T的对象

    3. 寻址和字节顺序

      1. 对于跨越多字节的对象,我们必须建立两个规则:这个对象的地址是什么,以及在内存中如何排列这些字节。在所有的机器上,多字节对象都被存储为连续的字节序列,对象的地址为所使用字节中最小的地址
      2. 小端法:最低的有效字节存储在低地址
        大端法:最高的有效字节存储在低地址
        如:一个十六进制数:0x01234567
        在这里插入图片描述
        新的处理器是双端法,因此可以把他们配置成作为大端或小端的机器运行。然而,一旦选择了操作系统,那么字节的顺序就固定了下来
      3. 对于大多数应用程序的程序员来说,其机器使用的字节顺序是完全不可见的。无论为那种类型的机器所编译的程序都会得到相同的结果。
        字节顺序成为问题的三个方面:
        1. 不同类型的机器之间通过网络传送二进制数据,比如小端法的机器将产生的数据发送到大端法机器或者放过来
        2. 阅读表示整数数据的字节序列。当阅读小端法机器生成的机器级程序表示时,经常将字节按照相反的顺序显示。正常书写字节序列时最高有效位在左边,最低有效字节为在右边,而小端法相反
        3. 当编写规避正常的类型系统的程序时。在C语言中,可以通过使用强制类型转化或联合来允许以一种数据类型引用一个对象,而这种数据类型和创建这个对象时定义的数据类型不同。
      4. 补充知识:
        1. 使用typedef来命名数据类型
          C语言中的typedef声明提供了一种给数据类型命名的方式。
          如:typedef int *int_pointer
        2. 使用printf格式化输出
          Printf函数的第一个参数时格式串,而其余的参数都是要打印的值。在格式串里,每个以"%"开始的字符序列都表示如何格式化下一个参数。如%d时输出一个十进制数,%f时输出一个浮点数,%c是输出一个字符
    4. 表示字符串
      C语言中字符串被编码为一个以null(其值为0)字符结尾的字符数组。最常见的编码标准是ASCII编码
      在使用ASCII作为字符码的的任何系统上都将得到相同的结果,与字节顺序和字大小规则无关。因而,文本数据比二进制数据更具有跨平台性

    5. 表示代码
      不同的机器类型使用不同的且不兼容的指令和编码方式。即使是完全一样的进程,运行在不同的操作系统之上也会有不同的编码规则,因此二进制代码是不兼容的。二进制代码很少能在不同机器和操作系统组合之间相互移植

    6. 布尔代数简介

      1. 布尔运算~对应于逻辑运算的NOT,在命题逻辑中用符号¬表示
                在这里插入图片描述
      2. 布尔运算&对应于逻辑运算的AND,在命题逻辑中用符号∧表示
              在这里插入图片描述
      3. 布尔运算|对应于逻辑运算的OR,在命题逻辑中用符号∨表示
              在这里插入图片描述
      4. 布尔运算^对应用逻辑运算异或,在命题逻辑中应用符号⊕表示
              在这里插入图片描述
      5. 位向量
        位向量就是固定长度的w、由0和1组成的串。位向量的运算可以定义成参数的每个对应元素之间的运算
    7. C语言中的位级运算
      C语言的一个很有用的特性是它支持按位布尔运算。
      |是OR(或) &是AND(与) ~是NOT(取反) ^是EXCLUSIVE-OR(异或)
      位级运算常见用法就是实现掩码运算,这里的掩码是一个位模式,表示从一个字中选出的位的集合

    8. C语言中的逻辑运算
      C语言还提供了一组逻辑运算符||、&&和!,分别对应于命题逻辑中的OR、AND和NOT运算。逻辑运算认为所有非零的参数都表示位TRUE,而参数0表示FALSE。它们返回0或者1,分别表示结果为TRUE或者为FALSE

    9. C语言中的移位运算
      C语言还提供了一组移位运算,分别为左移和右移

      1. 左移:x向左移动k位,丢弃最高的k位,并在右端补k个0
      2. 右移:逻辑右移:在左端补k个0
           算数右移:在左端补k个最高的有效位的值
         对于无符号数,右移必须是逻辑的
发布了38 篇原创文章 · 获赞 49 · 访问量 6954

猜你喜欢

转载自blog.csdn.net/Xiao_Jie123/article/details/103803904