1.整形在数据中的存储
比如:
int a = 20;
int b = -10
我们知道int类型的a会分配4个字节的空间,那该如何存储呢?
这里要涉及到一个概念:原码,反码,补码。
1.1原码,反码,补码
计算机中的有符号数(整数)有三种表示方法,即原码,反码,补码。
三种表示方法均有符号位和数值位为组成,符号位都是用“0”表示正,用“1”表示负,数值位的三种表示形式各不相同。
原码
直接将数字按照正负数翻译成2进制的数字即可。
反码
将原码除符号位按位取反也就是1改成0,0改成1。
补码
反码加1则得到补码。
我们再回到之前的问题
int main()
{
int a = 20;
//00000000 00000000 00000000 00010100 正数的原码,反码,补码相同
int b = -10;
//原码 10000000 00000000 00000000 00001010
//反码 11111111111111111111111111111110101
//补码 11111111111111111111111111111110110
return 0;
}
上面的内存是怎么来的呢?
对于整形来说,数据存放内存的时候其实存放的是补码。
这里面的存储是16进制,也就是4位2进制转化为1个16进制。
int main()
{
int a = 20;
//0000 0000 0000 0000 0000 0000 0001 0100
// 0 0 0 0 0 0 1 4
// 0x00000014
int b = -10;
//原码 10000000 00000000 00000000 00001010
//反码 11111111111111111111111111111110101
//补码 1111 1111 1111 1111 1111 1111 1111 1111 0110
// F F F F F F F F 6
// 0xFFFFFFF6
return 0;
}
2.大端存储和小端存储
2.1什么是大端小端?
大端存储模式:是指数据的低位保存到高地址处,数据的高位保存到低地址处。
小端存储模式:是指数据的低位保存到低地址处,数据的高位保存到高地址处。
大端存储 小端存储
低地址 14 00
00 00
00 00
高地址 00 14
2.2如何判断机器是大端存储还是小端存储?
这里用代码的形式来实现。
通过指针里的数据进行判断。
#include <stdio.h>
int main()
{
int a = 1;
char* p = (char*)(&a);
if (*p == 1)
{
printf("小端存储\n");
}
if (*p == 0)
{
printf("大端存储\n");
}
return 0;
}
而我的电脑也很明显是小端存储了。