计算机系统基础笔记(3)——信息的存储

前言

本篇主要学习了信息存储、二进制转换、位运算的相关内容

第一部分 使用比特表示信息

万物皆比特

大家都知道,二进制数据每一位只能用0或1来表示

  • 信息都可以使用二进制的编码(二进制位串)进行表示
    • 机器指令
    • 地址(无符号整数)
    • 表示和处理各种数字、字符串等

小科普:用二进制的信息使得计算机容易区分信息且能稳定存储

  • 由于数位有限 实数一般是近似表示

字节数据编码

  1. 1 Byte = 8 bits
    • Binary (二进制): 00000000 (2)
      to 11111111 (2)
    • Decimal(十进制): 0(10)
      to 255 (10)
    • Hexadecimal(十六进制):00 (16) to FF (16)(十六进制前接0x,大小写不限
      下面这个表很重要 大家最好记一下哦^^
      在这里插入图片描述

第二部分 位运算

布尔代数

  • 逻辑的代数表示方法,即用 10表示逻辑
  • “真”编码为1,“假”编码为0
    下面这个 学过离散的都知道^^~
    在这里插入图片描述
  • 比特向量的布尔代数运算
    逐位进行运算 没有进位或借位

在这里插入图片描述

C语言中的位运算

  • 四个运算符
    • | for Or (位或)
    • & for And (位与)
    • ^ for eXclusive-Or (位异或)
      • ~ for Not(位非)(单目运算符,即单个操作对象,其余三个是双目操作符)
  • 异或运算的应用:数据交换(交换时不使用额外变量
    在这里插入图片描述
    在这里插入图片描述

C语言中的逻辑运算

可以对比一下布尔逻辑运算

  • 定义了三种逻辑运算
    • || (logical or, 逻辑或)
    • &&(logical and, 逻辑与)
    • !(logical not, 逻辑非)
  • 短路效应(挺有趣的^^大家应该学C的话都会学到)
    • X && 5/X 可以用于避免除0运算
    • p && *p++ 可以避免空指针运算
    • 5 || X=Y 赋值语句将不会被执行

C语言中的移位运算

  • 逻辑移位
    • 右移运算有逻辑移位(左侧补0)
    • 对于无符号数,右移一定是逻辑的
  • 算术移位
    • 算术移位(左侧补原最高位值)
    • 在实践中,几乎所有的编译器针对有符号数的右移都采用的是算术右移
      对于有符号数,理论上编译器采用逻辑右移和算术右移都是符合规范的
      在这里插入图片描述
      上面的例子前两个是逻辑移位 第三个是算术移位

第三部分 信息的存储和表示

字长

  • 每台计算机都有一个字长的属性
    • 指针数据的标称大小(虚拟地址宽度)
  • 例如 32位 64位这样
    • 64位的寻址能力达到了18EiB
    • 寻址能力即最多用到多少内存
  • 一个字由多个字长组成 八位即一个字节 一位即两个比特

字 字节 字长知识

C语言中的各数据类型位宽

  • 32位与64位的区别:
    long数据类型上32位为4个字节,64位为8个字节;pointer数据类型上32位为4个字节,64位为8个字节
    在这里插入图片描述

字节序

  • 小端序(Little endian): Intel
    • 低地址存放低位数据,高地址存放高位数据
  • 大端序(Big endian): IBM, Sun Microsystem(Oracle)
    • 低地址存放高位数据,高地址存放低位数据
      在这里插入图片描述

信息的存储

指针的存储方法

  • 注意:不同的编译器和计算机可能会分配不同的地址
  • 甚至每一次运行时得到的结果都不相同!!!
    在这里插入图片描述
    x86-64的 显然结果也不一样
    在这里插入图片描述

字符串的表示

  • C语言的字符串使用char数组表示(区别于C++中的string
  • 每个字符都被编码成ASCII码
    • 一个7比特的字符编码集 (扩展集为8比特)
    • 字符“0” 的编码是0x30
    • 数字字符 i 的编码是0x30+i
  • 注意!!!:字符串的表示与字节序无关,大小端兼容
    下图的存储数据一致
    在这里插入图片描述

第四部分 补充知识

二进制转换

简单来说,十进制转换为其他进制 比如二进制就是除2,然后记录每次的余数,将余数倒过来写
二进制转换到十六进制,就是四个二进制数为一组 转换成一位十六进制数 具体参照之前给出的的表格(没错我又放了一遍^^)
在这里插入图片描述

话不多说,321上链接

进制转换知识

未定义行为

  • C语言规范中没有被明确定义的行为称为未定义行为
  • 编程时应避免使用未定义行为,有符号数算术右移除外
    $0就是说明返回值是0 因为超过位数了
    在这里插入图片描述

PE和ELF格式

  • Windows操作系统下常用的可执行文件格式是PE: Portable Executable (PE)
    在这里插入图片描述

  • Unix家族(含Linux)操作系统下可执行文件格式为ELF: Executable and Linkable Format (ELF)
    在这里插入图片描述

探索数据在存储器中的存储方式(实践)

  • 这段代码用于打印各变量的字节表示形式,可以用来查看自己的系统是大端序存储还是小端序存储
    • show_bytes函数用于绕开C语言中的类型系统

在这里插入图片描述

  • Linux32/64(小端)、Win32(小端)和Sun(32位,大端)系统下的结果
    在这里插入图片描述

Tips

可以试一下这个实践哦,然后相关的进制转换以及表格一定要熟悉且记牢^^
我们下期见^^

  • 37
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值