数据在内存中的存储
一. C语言中的数据类型
(1) 存整数的: char, short, int, long, long long, int*, int[2].
(2) 存浮点数数的: float, double, float[2].
(3) 结构体.
二. 整数在内存中的存储
整数在内存中的存储涉及两个方面,一方面是字节序,第二个方面是补码.
- 字节序
int num = 0X11223344
在内存中如果按照44 33 22 11这种方式来存数据就是小端字节序,按照11 22 33 44 这样的方式来存数据就是大端字节序.
(1) 有一个简便的记法:
<1> 大端序
如果平时吃鸡蛋就是从大头磕的话,符合直觉的排列方式就是你磕鸡蛋的方式
<2> 小小小
小端字节序,就是把低位(小)放在低地址(小)上
注:Intel的CPU主要都是小端,尤其是咱们用的PC
(2) 网络传输问题也涉及大端小端
网络传输也是一个字节一个字节的传输,按照大端还是小端这个是提前约定好的,一般是固定大端字节序传输.
(3)写一个简单的程序判断当前机器的字节序
<1> 首先得先把变量的地址取出来(编号最小的地址),如果咱们就只是把这个地址对应的这一个字节读取出来,判断它是0X11还是0X44就可以了,是0X11就是大端序,是0X44就是小端序.
<2> 想要取出一个字节,就要把int* 强制转换成为char* (这个指针之间的强制类型转换,不影响指针内部存储的地址值,只影响后续解引用代码对这个地址内存的长度的理解.
int isBigEnd(){
int num = 0X11223344;
int* p = #
char* p2 = (char*)p;
if(*p2 == 0X11){
return 1;
}
return 0;
}
- 补码
表示负数的时候用补码,正数不涉及补码,只是负数涉及(也就是说正数的补码是他自己本身)
(1) 原码: 在正数的二进制基础上,把符号位设为1;
反码: 符号位不变,其他位都取反;
补码: 反码加1;
(2)让计算机可以统一加法和减法:
<1> 计算机计算两个数字相加,是靠一个硬件设备"加法器",而减法补码就可以实现.
eg: 10+(-3)
10 的原码: 0000 0000 0000 0000 0000 0000 0000 1010
-3 的原码: 1000 0000 0000 0000 0000 0000 0000 0011
-3 的反码: 1111 1111 1111 1111 1111 1111 1111 1100
-3 的补码: 1111 1111 1111 1111 1111 1111 1111 1101
用-3的补码加上10的原码就是10+(-3)的结果:
0000 0000 0000 0000 0000 0000 0000 0111 (7)
注:原码=>补码 取反+1; 补码=>原码 取反+1;
<2> 乘法的本质就是连续相加;除法的本质就是连续相减,看能减几次,这实际上都能用加法来解决;而小数的加减乘除运算复杂,程序效率很低.