壹 2.1信息存储

引入:

研究问题有两种方法,一种是自顶向下,另一种是自底向上。对于设计来说,很多时候是自顶向下的,从一个整体想法出发,然后慢慢细化,比如以前的计算机网络;而在学习化学的时候,往往是自底向上的,比方说先去了解组成元素的基本粒子,然后在这些粒子的基础上进行更加抽象的研究。从这个角度看,学习计算机系统,自底向上可能是一个好的方向。

这里我们需要了解几个概念

字节:8bit,是最小的可寻址的内存单元。
虚拟内存:内存其实就是一个非常大的字节数组。
编译器运行时,将存储空间划分为可管理的单元,来存储程序对象。程序对象也就是程序数据,指令,控制信息。
其实,每个程序对象可以视为一个字节块,程序就是字节序列。
计算机中所有带虚拟的概念都是一种给机器假象
例子:c中的指针

进制

十六进制:hex

重点:十六进制,十进制,二进制,八进制之间的相互转化
十六进制表示,前面有一个前缀:0x,0X

之前,总线的时候,提到过字长。也就是我们所说的位。位决定的是什么呢?

答案是虚拟空间的大小!
比如:字长为w位的机器,虚拟地址的范围是0~ 2 ,所以32位机器虚拟内存限制是4GB

现在计算机基本上都是64位机器,64位机器可以运行32位机器。这是向后兼容。区别在于程序如何编译,而不是机器类型。

寻址

如果我们要寻找跨越多字节程序对象,那么问题来了?
对象地址在哪里?
内存中如何字节如何排列的?

几乎所有机器上,多字节对象存储为连续的字节序列。
对象地址是所使用的字节最小的地址

小端法和大端法

大端,小端来自于格列夫游记中的大小端之争
小端法:最低有效字节排前面
大端法:最高有效字节排前面
一个w位的整数,其位表示为
壹 2.1信息存储
假设w是8的倍数,则划分为字节。每八位一划分
壹 2.1信息存储
壹 2.1信息存储
从左到右,分别是最高有效字节,一直到最低有效字节。

字节序列引发的问题:
1、不同类型机器通过网络传送二进制数时,接收到的程序字里面的字节是反序的。
2、阅读表示的整数数据的字节序列时,字节序列顺序是反序的。
3、规避正常的类型系统的程序。

壹 2.1信息存储所以无论哪种数据,除了字节顺序,其余都相同。
值得注意的是:指针值完全不一样,不同的机器/操作系统使用不同的存储分配规则。指针值和机器无关!

字符串

c语言里面,string 背编码为一个以null结尾的字符数组。从这个定义可知,string本质是数组,是一个char型的数组。

使用ASCII的字符文件再任何系统得到相同的结果。所以文本文件比二进制文件具有更强的可移植性。

二进制代码不兼容性

不同类型机器使用不同的且不兼容的指令和编码方式。所以二进制文件不兼容,不可移植。

bool布尔运算符

bool运算来源于乔治·布尔(1815–1864),他是自学成材的英国数学家。布尔代数是研究逻辑推理的基本准则。

~表示非
&表示和
|表示或
^表示 exclusive—or,也就是异或。命题逻辑中用⊕表示,同真同假为0。

异或可以扩展到位向量的运算中,比如w=4,a=[0110],b=[1100],
a&b,得到以下结果:
**0110
&1100
——————
0100
位运算的一个重要应用是表示有限集合

c语言中的位级运算

C语言一个重要特性,它支持按位布尔运算。

位级表达式

确定一个位级表达式的结果最好的方法就是
将16进制化位2进制,然后进行运算,后来转为16进制。

掩码运算

位级运算的常见用法就是实现掩码运算。
掩码是一个位模式,表示从一个字中选出来的位的集合。
比如:
0xFF表示一个字的低位字节,位级运算x&0xFF生成一个x的最低有效字节组成的值,其他字节设置为了0。x=0x89ABCDEF,其表达式得到0x000000EF,~x生成一个全1的掩码。
不管机器字节是多大,同样的掩码可以写成0xFFFFFFFFF。

逻辑运算

与,或,非

移位运算

左移

按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
语法格式:
需要移位的数字 << 移位的次数
  例如: 3 << 2,则是将数字3左移2位
计算过程:
3 << 2
  首先把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011,然后把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位,最后在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100,则转换为十进制是12。
数学意义:
在数字没有溢出的前提下,对于正数和负数,左移一位都相当于乘以2的1次方,左移n位就相当于乘以2的n次方。

右移

按二进制形式把所有的数字向右移动对应位移位数,低位移出(舍弃),高位的空位补符号位,即正数补零,负数补1。
语法格式:
需要移位的数字 >> 移位的次数
  例如11 >> 2,则是将数字11右移2位
计算过程:
11的二进制形式为:0000 0000 0000 0000 0000 0000 0000 1011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 0010。转换为十进制是2。
数学意义:
右移一位相当于除2,右移n位相当于除以2的n次方。

无符号右移运算符规则:

按二进制形式把所有的数字向右移动对应位数,低位移出(舍弃),高位的空位补零。对于正数来说和带符号右移相同,对于负数来说不同。
  其他结构和>>相似。
  
  但是:
  如果数据为w位,移动k位,k>=w时应该怎么办?
  实际上移动kmodw位,这种行为是没有保证的。
  
  操作符优先级的问题:加法比移位运算符优先级高,还应该考虑左结合性。

参考链接:https://wdxtub.com