二进制与内存

China☆狼群 提交于 2020-03-17 07:41:24

1 进制的概念

十进制
在日常生活中,通常使用10进制进行计数
基础符号: 0 1 2 3 4 5 6 7 8 9
比如:
2 表示
9 表示
11 表示

十进制
10进制计数时,逢十进位
0 1 2 3 … 7 8 9
10 11 12 13 … 17 18 19
20 21 22 23 … 27 28 29
30 31 32 33 … 37 38 39
一共10个符号,数到9就完了,就必须采用进位的手段来计更大的数

十进制
对于一个10进制的数,每一位有不同的权重
例如,2 6 2
每一位代表的是:
2 x 100
6 x 10
2 x 1
其中,262 = 2 x 10*2 + 6 x 10 1+ 2 x 100

八进制
类比一下,可以得到八进制的规律
基础符号 0 1 2 3 4 5 6 7
计数:( 逢八进位 )
0 1 2 … 6 7
10 11 12 … 16 17
20 21 22 … 26 27
八进制数 2 3 6 = 2 x 8*2 + 3 x 8 + 6

二进制
类比一下,可以得到八进制的规律
基础符号 0 1
计数:( 逢二进位 )
二进制数 110 = 1 x 2*2 + 1 x 2 + 0
0 (0)
1 (1)
10 (2)
11 (3)
100 (4)
101 (5)
110 (6)
111 (7)

十六进制
十六进制有16个基础符号
0 1 2 3 4 5 6 7 8 9 A B C D E F
计数:( 逢十六进位 )
0 1 2 … 8 9 A B C D E F
10 11 12 … 18 19 1A 1B 1C 1D 1E 1F
20 21 22 … 28 29 2A 2B 2C 2D 2E 2F
十六进制数 2 A C = 2 x 16*2 + Ax 16 + C

注意:
介绍了进制的概念
计算机编程领域有2进制,8进制,10进制,16进制, 36进制,64进制。
常见的是2进制,10进制,16进制
需要掌握:给定一个16进制,会换算成10进制

小结:
1,各个进制的原型与表达
2,各进制转换成10进制(权重)

2 十六进制

十六进制
十六进制,是C语言编程里用的比较多的计数表示法

十六进制有16个基础符号
0 1 2 3 4 5 6 7 8 9 A B C D E F
计数:( 逢十六进位 )
0 1 2 … 8 9 A B C D E F
10 11 12 … 18 19 1A 1B 1C 1D 1E 1F
20 21 22 … 28 29 2A 2B 2C 2D 2E 2F
十六进制数 2 A C = 2 x 16*2+ Ax 16 + C

在 C 语言代码里,用 0x 代表一个16进制数
示例1:
int a = 0x2A;
int b = 42;
printf(“a=%d, b=%d \n”, a, b);
换算一下,0x2A= 2 x 16 + 10 = 42

示例2:
int a = 0x12345678;
int b = 12345678;
printf(“a=%d, b=%d \n”, a, b);
显然,a,b 的值是不同的,a的值要大一些

示例3:使用%X 可以按十六进制打印
int a = 55;
printf(“16进制: %X \n”, a);
printf(“16进制: %08X \n”, a);
其中,%08X 表示补齐8位,不足时补0

注意
1 八进制也可以直接表示,但用的不多
如: int flag = 022; ( 以0开头的表示8进制)
2 二进制在C语言里不能直接表示
int b = 1100101; // 二进制不能直接写!

小结
1,十六进制在C语言中的表示和显示
2,八进制的表示

3 二进制

二进制与十六进制
二进制与十六进制的对应:
0 ( 0 ) 1000 ( 8 )
1 ( 1 ) 1001 ( 9 )
10 ( 2 ) 1010 ( A )
11 ( 3 ) 1011 ( B )
100 ( 4 ) 1100 ( C )
101 ( 5 ) 1101 ( D )
110 ( 6 ) 1110 ( E )
111 ( 7 ) 1111 ( F )

2进制 16进制 ( 四位一组 )
0100 1100  4C
1010 1111  AF
1110 0001  E1

二进制的物理表示
在计算机硬件里,数据是以二进制表示的
一般高电平代表1,低电平代表0
通俗示例:灯亮为1,灯灭为0
1100 0101 ( C5 )
1000 1010 ( 8A )

在计算机里,数据的最小存储单位是字节 Byte
1 Byte = 8 Bit ( 1 字节含8位 )
全0时,00000000 , 表示 0x00 ( 0 )
全1时,11111111 , 表示 0xFF (255)
所以,一个 Byte 可以表示 0 - 255 之间的整数

那么,有一个数 2018 ,应该用几个Byte表示?
2018 = 0111 1110 0010 ( 1.5 字节 )
9000000 = 1000 1001 0101 0100 0100 000 ( 3字节 )
而 int 类型是4个字节,所以用int可以表示上述数值
int a = 2018, b = 9000000;

正数与负数
通常,最高位称为符号位
最高位0:表示正数
最高位1:表示负数
所以,一个字节可以表示 -128 ~ 127 范围的整数
( -128, -127, …, -2, -1, 0, 1, …, 127 )
注:了解一下,无需深入

注意:
介绍了二进制的概念,以及二进制的物理表示
本节只需了解大概原理:
一个字节8个位,一个字节最多表示0-255
一个int是4个字节,可以表示很大的数
11111111 11111111 11111111 11111111

小结:
1,二进制的表示
2,二进制与十六进制的转换
3,存储的单位,字节与位

4 变量的内存地址

变量的内存地址
在 C 语言里,每一个变量都有一个内存地址
示例1:
int count = 10;
int* ptr = &count;
printf(“address: %p \n”, ptr);
其中,
int* 是一种新的类型,表示int型变量的地址 &a 表示取得a的内存地址, %p 表示打印地址

变量的内存地址
注意:
1 变量的地址是随机分配的,每次运行都不一样
2 int* 视为一个整体,是一个新的类型
3 一个int占4个字节,字节的顺序是小端在前 比如 0x12345678 的排列顺序是 78 56 34 12

观测 int 的内存值
示例2:
int a = 10;
int* p = &a;
printf(“address: %p \n”, p);
a = 0x12345678;
a = 0x55555555;
注:在断点状态下,打开 调试|窗口 | 内存| 内存1

观测 int[] 的内存值
示例3: 观察数组的内存值
int a[4] = { 1, 2, 3, 4 };
a[0] = 0x12345678;
a[3] = 0xA0A0A0A0;
输入 &a 即数组变量的地址
注:在断点状态下,打开 调试|窗口 | 内存| 内存1

注意:
了解了使用 int* 表示int变量的地址
学会了在内存窗口观察变量值的变化
一个大胆的想法:有了变量的地址,是不是能直接修 改内存呢?

小结:
1,变量的地址
2,变量的内存值

学习资源 《C语言快速入门》

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!