现代计算机存储和处理的信息都是用二进制表示的,即0和1。ios
用多个二进制比特位的不一样组合和不一样解释可以表示数量有限的元素,好比用32位比特的组合则有2^32种可能,所以它能表示从0开始到4294967295 (2^32个)。程序员
须要程序员关注的是三种二进制解释:1. 无符号二进制的组合解释;2. 有符号二进制的组合解释;3. 浮点数二进制的组合解释。编程
这些不一样解释组合可以进行的操做也不同,好比有符号和浮点数虽然逻辑上都能加减乘除,但CPU的具体硬件运算实现细节实现确定不一样。编程语言
因为是用多个二进制比特位的来进行组合的,所以其可以表示的数量是有限的。超出表示范围以后是什么行为?这种超出范围的描述称为:溢出。在C++中,无符号类型溢出表现是初始值对全部可能的值取模后的余数;有符号行为则不肯定。spa
对于整数来讲,其表示是精确的,假设1用0000 0000 0000 0000 0000 0000 0000 0001表示,那么0000 0000 0000 0000 0000 0000 0000 0001就是1,不会是2。操作系统
对于浮点数来讲,其表示是近似值,由于某段范围内小数的个数是无穷的,没法彻底表示,好比1和2之间的小数个数就不能彻底表示出来。指针
操做系统为每一个进程抽象了虚拟内存的概念,使得每一个程序认为它得到到的内存是连续的。事实上,内存空间是不连续的。此外,操做系统还对内存空间进行划分,有些专门存储代码指令,有些专门存储数据信息,根据这些不一样划分,操做系统能够附加一些措施,从而阻止缓冲区溢出攻击。例如,咱们能够在C/C++中经过自行分配一段堆内存,而后在该堆内存上构建二进制指令,再嵌入汇编,使用jmp指令跳转到堆内存上执行构建的二进制指令。Linux和Windows经过使用一种叫作dep的技术来检查当前内存是用于存储数据的,不该该当作指令执行,从而阻止恶意代码。code
在C/C++等编程语言中,虽然存取不一样类型的变量都是经过访问变量名来实现的,但其底层实现并不相同,以下:blog
#include <iostream> int main() { int i; i = 5; short s; s = 6; return 0; }
经过反汇编,查看二进制机器码,能够发现不一样类型的变量的读写用的是不一样指令,对于int类型的局部变量的写入,只用了一条指令,而short类型的局部变量的写入,用了两条指令,先是写入到eax寄存器,而后再从eax的低位寄存器ax中写入到变量中。进程
从这里也能够联想到C/C++中的指针,为何会有不一样类型的指针,这是由于语言层面的类型指针在编译以后所生成二进制机器码不一样,固然读写的字节数也不同。