计算机的本质就是二进制,0/1,称之为bit(位),一个位没有什么意义,当同时拥有多个位,并且加上某种解释,就可以表示任何有限集合的元素。(为什么是有限?因为用bit来表示元素是有限的,bit的组合数量是由bit数决定的,例如8个bit,那么所能表示的组合就是2^8种。即使bit次数增加,总数仍然是有限的,所以能表示集合元素数量也是有限的)。
计算机的表示法就是用有限的位对数字进行编码,因此,当结果太大就会“溢出”。比如3位模式下的最大值是111也就是7,111+1就会变成1000,把最高位抹去,就是0。
信息存储:
大多数计算机把8bit封装成一个块(字节),作为内存中的最小可寻址单元,而不是访问内存中单独的位
程序把内存抽象成一个字节数组(虚拟内存);内存中的每一个字节用一个唯一的数字表示(这里可能有异议,地址不都是:0x12fd1b……这样的形式吗,这是16进制表示法,换算成10进制就是数字),称为地址。所有可能的地址集合就是虚拟地址空间。
每个程序对象(程序数据、指令和控制信息)可以看成一个字节块,程序本身就是一个字节序列。
C语言的指针的指向就是某个程序对象的首地址。
二进制太冗长,10进制和二进制转换又麻烦,所以引入16进制(0x),一个16进制位可以表示4位二进制,从右往左分配,到后面不足4位往左补0;(i+4j——2^11=3+2*4——0x800); 进制转换
计算机的字长:
每个计算机都有一个字长,这个字长也就是我们常说的64位机器,32位机器。虚拟地址就是这样一个字来编码的(8字长就是64位,4字长就是32位),字长决定虚拟地址空间大小。32位程序可以运行在64位机器,但是64位程序只能在64位机器(向后兼容,但是没有向前兼容)。32位程序和64程序的区别只是在于如何编译,而不是运行机器类型。
寻址和字节顺序:
对于跨越多字节的程序对象,要建立两个规则:1这个对象的地址是什么 2在内存中如何排列这些字节。多字节对象被存储为连续的字节序列,对象的地址就是首地址(最低的)。
考虑一个整数转化为w位的二进制,如果w是8的倍数,这些位就会被分组成为字节,因为一个字节8位,最高有效字节就是最前面8个位,最低有效字节就是最后面8个位,其他字节包含中间位。
大端法:最高有效字节存储在最前面也就是低地址处;小端法:最低有效字节存储在低地址处。
表示字符串:
文本数据比二进制数据有更强的平台独立性:文本本质上也是二进制数据,但是已经封装成一个个规则(ASCII,UTF-8等),所以不同平台系统处理这些数据会有一致的方式,背后的地址数据在不同平台差异较小;
但是二进制数据,在不同平台系统中,大小端,数据类型的字节长度和解释方式都有差异,背后的地址规则更别说了。
布尔代数:略
整数表示:
这小节没啥说的,都要靠算
T和U转换:对于C语言来说:位模式不变,但是解释的方式变。