#include <stdio.h>
int main()
{
printf("hello world\n");
return 0;
}
#include <stdio.h>
直接插入文本printf
, 打包进入程序1.从硬盘中复制到主存,
2.处理器开始处理主存中的程序的机器语言指令,
第一个联想到的自然是内存条,但其实内存条,但其实CPU也有存储器,其实硬盘也是存储器的一种,网络文件,类似于图床也是一种存储器,由上到下,分成了7个级别
其中,高一层是低一层的高速缓存, 但是其实,cpu有自己的随机存储器 ROM - read-only-memory, 只读存储器
抽象是一个重要的概念,程序底层运行很复杂,比如"+",但是实际通过指令操作,简化了,比如封装一个函数,
其实就是一种的I/O设备
二进制构成的数字王国
大多数机器使用8位的块,或者字节,来作为最小的可寻址的内存单位,而不是访问内存中单独存在的单位,,机器级程序将内存视为一个庞大的数组,-虚拟内存,实际上就是将动态随机访问存储器,(DRAM),闪存,磁盘存储器,特殊硬件和操作系统软件结合在一起,为程序提供一个看上去统一的字节数组.C中的指针就是指向内存中某个存址,,虽然C维护这这类型信息,但是,他生成的机器级程序并不包含数据类型的信息,..每个程序都可视为单个字节块,而程序就是一个字节序列.
它提供了引用数据结构的元素的机制,,与变量类似,指针不是变量,指针有两个方面,值和类型,它的值表示某个对象的位置,它的类型表示那个位置上存储对象的类型,比如整数和浮点数, 真正想理解指针,需要在机器及上的表现和实现.
10进制和2进制交互困难, 事实上,一个字节由8位组成,,二进制中表示方法即是,0000000011111111,当然如果看成十进制 0 ~ 255,当然用16进制表示就简单了,00FF
序号 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
二进制 | 0000 | 0001 | 0010 | 0011 | 0100 | 0101 | 0110 | 0111 | 1000 | 1001 | 1010 | 1011 | 1100 | 1101 | 1110 | 1111 |
十进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 |
十六进制 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
在C中,0x开头的就是16进制数.FA1D37B 也写成 0XFA1D37B,事实上,2进制,16进制互转很简单.
字长大小决定虚拟空间大小 0-2^w-1 范围 最近的32位字长限制虚拟空间为4GB, 而64位的虚拟空间地址为16EB,大约是1.84X10^19字节,同时64位机向下兼容32位
&
0 | 1 | |
---|---|---|
0 | 0 | 0 |
1 | 0 | 1 |
a&b
串联电路图
|
0 | 1 | |
---|---|---|
0 | 0 | 1 |
1 | 1 | 1 |
a|b
并联电路图
!
0 | 1 | |
---|---|---|
1 | 0 |
!a
0 | 1 | |
---|---|---|
0 | 0 | 1 |
1 | 1 | 0 |
// 这个利用 | & 逻辑结合实现
const xor = (a, b)=> (a|b) & (!(a&b))
// 简单来说 就是 利用
0,1 & !(0,0) => 0,1
1,1 & !(0,1) => 1,0
0+0
0+1
1+0
1+1
...把一系列的一位数加法器串联就得出全家发机