#斯坦福公开课笔记,day10.28.18
1 C语言中数据类型在内存的存储方式
bool 1byte
char 1byte
short 2byte
int 4byte
long 4byte
double 8byte
2 补码的基本原理:最高位代表符号位,为了实现加法运算的简便性,相反数相加为0的操作
0x00001111
+0x10001111
0x1001110 = -7 不是期望的0;
补码,(1)所有位取反:0x11110000
(2) +1 得到补码:0x11110001
(3)此时补码与原有二进制数相加恰好为0,正确表示了相反数的含义。对应的0x11110001,表示-7,其中最高位代表符号位。
3 位模式复制
长字节类型数据赋值给低字节数据类型;
short s = 67;
char ch = s; 在内存中将short的低八位进行位复制到char型;
带符号的数据进行扩展赋值时候:
short s = -1;
int i =s; 此时高位的int型会进行符号位拷贝,填满高位的两个byte;
4 浮点数的存储协议
对于一个float型的数据
高位--------------->低位
符号位占1位,exp:占8位,.xxxxxx: 剩下23位表示2的负次幂
而实际表示存储的数据为(-1)^ (s) * 1.xxxxxxxxxxx 2^(exp-127),exp是一个8位unsigned的整数,0-255
5 int i =37;
float f = (float *) &i;
& 取地址,
(float *) 表示这块内存地址存储格式是float型的;
- :解引用;
实际这个过程只到解引用之后内存里的数会按照float型的协议转化
6 结构体:
struct fraction {
int num;
int deno;};
pi.num = 22;
pi.deno = 7;
如下操作:
((fraction*)&(pi.deno) )->num = 12 ;
注意该过程中的原 pi.deno 存储内容发生了变化;
7:数组名编译后就是这块内存区域的首地址,
在C语言中,不会进行越界检查,导致出现问题:
int array [10];
array[10] =1;这些内存区域可能不存在,若存在会将该内存位模式的解析转化为int型,形成意想不到的结果;
array[-4] =77; 这些内存区域可能不存在,同上。
8 大小端
大端:低地址高权重,高地址低权重;
小端:低地址低权重,高地址高权重;