内存
此图是8086CPU的内存空间:8086CPU的地址总线宽度为20,可以定位到2^20个不同的内存单元(内存地址的范围是0x00000-0xFFFFFF),所以8086的内存空间大小为1M。
- 0x00000-0x9FFFF:主存储器,可读可写
- 0xA0000-0xB0000:向内存中写入数据,这些数据会被显卡输出到显示器,可读可写
- 0xC0000-0xFFFFF:存储器中各种硬件/系统信息,只读。
这个作为早期的内存结构,现在的内存是访问不到系统信息的,因为做了虚拟地址的隔离
学习进制的障碍
进制学习的主要障碍是我们的教育目前都是以十进制来传递给我们的,学习使用了很多年,已经深入骨髓,在学习其他进制的时候,总是要以十进制为依托,先入为主,器思考,这种方式本质上就是错误的。现在程序员接触到的二进制、八进制、十六进制,每一种进制都是完美的。都有各自的计算规则。不需要按十进制来思考!不需要按十进制来思考!不需要按十进制来思考!重要的事情讲三遍。
进制的定义
- 二进制由2个符号组成:0、1逢二进一
- 八进制由8个符号组成:0、1、2、3、4、5、6、7逢八进一
- 十进制由10个符号组成:0、1、2、3、4、5、6、7、8、9逢十进一
- 十六进制由16个符号组成:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F逢16进一
其实我们国家古代的人是非常智慧的,十六进制使用的是非常早的,"半斤八两"讲的就是十六进制。一斤是16两
进制的运算
八进制加法表
ini
0 1 2 3 4 5 6 7
10 11 12 13 14 15 16 17
20 21 22 23 24 25 26 27
. . .
1+1 = 2
1+2 = 3 2+2 = 4
1+3 = 4 2+3 = 5 3+3 = 6
1+4 = 5 2+4 = 6 3+4 = 7 4+4 = 10
1+5 = 6 2+5 = 7 3+5 = 10 4+5 = 11 5+5 = 12
1+6 = 7 2+6 = 10 3+6 = 11 4+6 = 12 5+6 = 13 6+6 = 14
1+7 = 8 2+7 = 11 3+7 = 12 4+7 = 13 5+7 = 14 6+7 = 15 7+7 = 16
. . .
八进制乘法表
ini
0 1 2 3 4 5 6 7
10 11 12 13 14 15 16 17
20 21 22 23 24 25 26 27
. . .
1*1 = 1
1*2 = 2 2*2 = 4
1*3 = 3 2*3 = 6 3*3 = 11
1*4 = 4 2*4 = 10 3*4 = 14 4*4 = 20
1*5 = 5 2*5 = 12 3*5 = 17 4*5 = 24 5*5 = 31
1*6 = 6 2*6 = 14 3*6 = 22 4*6 = 30 5*6 = 36 6*6 = 44
1*7 = 7 2*7 = 16 3*7 = 25 4*7 = 34 5*7 = 43 6*7 = 52 7*7 = 61
. . .
二进制:从0写到1111 0000 0001 0010 0011 0100 0101 0110 0111 1000 1001 1010 1011 1100 1101 1111 十六进制: 0 1 2 3 4 5 6 7 8 9 A B C D E F
数据宽度
数学上的数字,是没有大小限制的,可以无限大,但是在计算机中,由于受硬件的制约,数据都是有长度限制的(成为数据宽度),超过最大数据宽度的数据会被丢弃
objectivec
#import <UIKit/UIKit.h>
#import "AppDelegate.h"
int test() {
int cTemp = 0x1FFFFFFFF;
return cTemp;
}
int main(int argc, char * argv[]) {
NSString * appDelegateClassName;
printf("cTemp:%x\n",test());
@autoreleasepool {
// Setup code that might create autoreleased objects goes here.
appDelegateClassName = NSStringFromClass([AppDelegate class]);
}
return UIApplicationMain(argc, argv, nil, appDelegateClassName);
}
会有一个警告
Implicit conversion from 'long' to 'int' changes value from 8589934591 to -1,cTemp的值为-1
###计算机中常见的数据宽度
- 位(Bit):1个位就是1个二进制位(0或者1)
- 字节(Byte):1个字节由8个Bit组成(8位),内存中最小的单元式Byte
- 字(Word): 1个字由2个字节组成(16位),这2个字节分别成为高字节和低字节
- 双字(DoubleWrod): 1个双字由2个字组成(32位)
计算机储存数据会分为有符号和无符号数,无符号数,直接运算。有符号数:正数:0 - 7,负数:-8 - F,