整形在内存中的存储
计算机中的有符号数有三种表示方法,原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位用0表示正,1表示负,数值位则不同。
原码
- 原码直接将二进制按照正负数的形式转换成二进制就可以了。正数负数同理,只是符号位不同。
- 例:数字10表示为原码的形式为0000 0000 0000 0000 0000 0000 0000 1010,数字-10用原码表示为1000 0000 0000 0000 0000 0000 0000 1010。
反码
- 反码即将原码的符号位不变,其他位依次按位取反即可。
- 例:数字10的反码为0000 0000 0000 0000 0000 0000 0000 1010,而数字-10的反码为1111 1111 1111 1111 1111 1111 1111 0101。
补码
- 补码就是在反码的基础上加1
- 例:数字10的补码为0000 0000 0000 0000 0000 0000 0000 1010,数字-10的补码为1111 1111 1111 1111 1111 1111 1111 0110。
总结:正数的原码,反码,补码都相同;计算机中存放的都是数字的补码。
大小端字节序
大端模式
数据的地位保存在内存的高地址,数据的地位保存在内存的低地址。
例如手机端采用大端模式。
小端模式
数据的低位保存在内存的低地址,数据的高位保存在内存的高地址。
例如pc端采用小端模式。
int n=0x11223344;
char *p=&n;
*p=0;
此时n的值变为0x11223300,这就是小端模式的一个体现。
因为是低位数据存在低地址中,而计算机在处理数据时是从低地址的数据依次处理,char类型的数据只有一个字节,它在访问n的值时,只能访问到低地址的第一个字节,因此只能将44置为00。
总结
通过了解大小端的字节序模式,帮助我了解了计算机内存处理数据时的方式,对于一些易错题,会有更清晰的理解。我们一般接触小端模式会更多,小端的思想会在代码中体现的比较多。