前言
本篇主要学习了信息存储、二进制转换、位运算的相关内容
第一部分 使用比特表示信息
万物皆比特
大家都知道,二进制数据每一位只能用0或1来表示
- 信息都可以使用二进制的编码(二进制位串)进行表示
- 机器指令
- 地址(无符号整数)
- 表示和处理各种数字、字符串等
小科普:用二进制的信息使得计算机容易区分信息且能稳定存储
- 由于数位有限 实数一般是近似表示
字节数据编码
- 1 Byte = 8 bits
- Binary (二进制): 00000000 (2)
to 11111111 (2) - Decimal(十进制): 0(10)
to 255 (10) - Hexadecimal(十六进制):00 (16) to FF (16)(十六进制前接0x,大小写不限)
下面这个表很重要 大家最好记一下哦^^
- Binary (二进制): 00000000 (2)
第二部分 位运算
布尔代数
- 逻辑的代数表示方法,即用 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
可以试一下这个实践哦,然后相关的进制转换以及表格一定要熟悉且记牢^^
我们下期见^^