十进制对人处理信息来说很友好。
二进制在构造存储和处理信息的机器时表现的更好。可以很容易被表示、存储、传输。如:穿孔卡片上的有洞无洞,导线上的高低电压,顺时针或逆时针的磁场。
单独的位或者位组合必须有上下文才有意义。
无符号编码:大于等于零的数字。
补码编码:表示有符号整数的方式。
浮点数编码:表示实数的科学记数法以2为基数的版本。
计算机的表示法是用有限数量的位来对一个数字编码,所以会产生溢出。
信息存储:
一般计算机使用8位的块(字节byte)作为最小的可寻址的内存单位,而不单独访问内存中的单独位。
机器级程序将内存视为一个非常大的字节数组,称为虚拟内存,内存的每个字节都由一个唯一数字来标识,称为它的地址,所有可能地址的集合就称为虚拟地址空间。
虚拟地址空间展现给机器级程序的是概念性的映像。实际是将动态随机访问存储器DRAM,闪存,磁盘存储器,特殊硬件和操作系统软件结合起来,为程序提供一个看上去统一的字节数组。
一个程序内部有不同的对象,如程序数据,指令,控制信息。编译器和运行时系统将存储空间划分为更可管理的单元,使用各种机制来分配和管理程序不同部分的存储。这种管理完全是在虚拟地址空间里完成的。
C语言的指针包含两个方面:值和类型。编译器会根据指针值类型生成不同的机器级代码来操作值。
十六进制表示法:
一个字节由8位组成,十进制的值域是0-255.二进制的值域是00000000-11111111。两种符号表示法对于描述位模式都不方便,二进制太冗长,十进制转化麻烦。用16为基数的十六进制数(hex),表示位模式。使用数字0-9和字符A-F表示16个值,一个字节的值域为00-FF。
以0X或0x开头的数字常量被认为是十六进制数。
十进制,二进制,十六进制的相互转换。
1.0X39A7F8转为二进制--0011 1001 1010 0111 1111 1000
2将1100 1001 0111 1011转为十六进制数 0XC97B
字数据大小:
每台计算机都有一个字长来定义指针数据的标准大小。虚拟地址是以这样一个字来编码的,字长决定的最重要的系统参数就是虚拟地址空间的最大大小。
对于一个字长为W位的机器而言,虚拟地址范围位0~2^W-1,程序最多访问2^W个字节。如:32位机和64位机。
C语言声明指针
对于任何数据类型T,声明 T *p; 表明p是一个指针变量,指向一个类型为T的对象。
寻址和字节顺序
计算机对于寻址,必须基于两个准则:这个对象的地址是什么,以及在内存中如何排列(大端法和小端法)。
对于多字节对象的地址使用其所有字节中最小的地址。就像数组对象的地址是数组第一个值的地址。
在内存中排列顺序:大端法和小端法之争。此处概念容易混乱
小端法:最低有效位在前面,最高有效位在后面。
大端法:最高有效位在前面,最低有效位在后面。
Interl兼容机一般用小端模式。
现在的计算机的微处理器是双端法。可以配置成大端或者小端的机器运行。
反汇编器:是一种确定可执行程序文件所表示的指令序列的工具。
大端法机器和小端法机器之间交互时的问题:
1.字节顺序问题,小端机产生的数据被发送到大端法机器或者反过来,接收到的字节都是反序的。通过网络应用程序来进行转化。
2.阅读机器级源码时,也会产生问题(因为高级语言屏蔽了这个问题)。
3.强制类型转换或者联合来以一种数据类型引用一个对象,这种转换前的数据类型与转换后的数据类型不同。这种如果不确定大端法还是小端法,就会转换出错。
C语言中的typedef
typedef提供了一种给数据类型命名的方式。
C中取地址运算符&。
表示字符串:
C语言中字符串被编码为一个null(其值为0)字符结尾的字符数组。
布尔代数:
逻辑值true和false编码为二进制值1和0
四种逻辑运算:与&、或|、非~、异或^
逻辑运算可以用逻辑电路来实现,就是与门,或门,非门,异或门。然后又抽象出来半加法器和全加法器。
布尔环的的概念。
(a^b)^a = b
这种可以用来交换两个数据的位置。
如:交换一个数组中a和b的位置。常用的方法是引入一个临时变量
int temp = a;
a=b;
b=temp;
如果使用布尔环(面试题):
a = a^b;
b = a^b;
a=a^b;
C语言中的位级运算 & | ~ ^:
位级运算一个用法就是实现掩码运算,掩码是一个位模式,表示从一个字中选出位的集合。
例如:掩码0xFF可以表示低8位的集合。0x89ABCDEF & 0xFF = 0x000000EF
C语言中的逻辑运算 && || !
逻辑运算认为所有非零的参数都表示true,而0表示false。
C语言中的位移运算:
>>右移符号,<<左移符号。
左移时丢弃最高位,并在右端补0。
右移时分为:逻辑右移和算术右移。
逻辑右移丢弃低位,在左端补0.
算术右移在左端补最高有效位的值。
Java中,>>表示算术右移,>>>表示逻辑右移。
整数表示:
用位来编码整数的两种不同方式:一种只能表示非负数,一种能表示负数、零、正数。
整型数据类型:关键字-char short long int unsigned
C支持有符号和无符号数,Java只支持有符号数。
无符号数的编码
补码编码:有符号数的计算机表示负数的方式就是补码。
最高有效位是符号位,1表示值为负,0表示值为非负。
有符号数还有两种标准表示法:反码和原码。
有符号数和无符号数之间的转换。
整数运算:
两个正数相加得到一个负数,是由于计算机运算的有限性造成的。
1.无符号数相加
2.补码相加
浮点数
1.二进制小数
2.IEEE浮点表示
3.数字示例
4.舍入:向偶数舍入,向零舍入,向下舍入,向上舍入。
5.浮点运算
小结:
计算机将信息编码为位,通常组织成字节序列。