adc网站建设网站建设与运营未来发展
目录
数据存储
1,二进制存储方式(补码,反码,源码)
2,指针类型
3,大端,小段判断
1,二进制存储方式(补码,反码,源码)
我们向计算机输入的数据(数字,字符串等)都是怎样存储的呢?
我们输入的数据计算机将这些数据转化成二进制形式进行存储
二进制:就是0,1 组成的序列 下面以代码的形式进行展示
//int main()
//{
//	int a = 20;
//	//
//	//00000000000000000000000000010100 - 原码
//	//00000000000000000000000000010100 - 反码
//	//00000000000000000000000000010100 - 补码
//	//00000014
//
//	int b = -10;
//	//
//	//10000000000000000000000000001010 - -10的原码
//	//11111111111111111111111111110101 - -10的反码
//	//11111111111111111111111111110110 - -10的补码
//	//FFFFFFF6
//	//内存中存储的都是二进制数据
//	//
//	return 0;
//} 
由上面代码可以看出 对于正整数而言 其 源码,反码,补码 都相同
然而 ,对于复数 它的源码,反码,补码 是不同的
原码 按位取反 得到 反码 反码 加一 得到 补码
补码 减一 得到 反码 反码 按位取反 得到 原码
计算机存储的是补码 也是用补码进行计算的
如:1+(-1)= 0
//int main()
//{
//	1 - 1;
//	1 + (-1);
//	//使用原码计算
//	//00000000000000000000000000000001
//	//10000000000000000000000000000001
//	//10000000000000000000000000000010
//	//-2
//	//00000000000000000000000000000001
//	//10000000000000000000000000000001
//	//11111111111111111111111111111110
//	//11111111111111111111111111111111 -1的补码
//	//00000000000000000000000000000001
//	//11111111111111111111111111111111
//	//00000000000000000000000000000000
//	//
//	return 0;
//} 
2,指针类型
int main()
{int a = 10;int* p = &a;retuen 0;
} 
a就是一个数据 “&” 取地址操作符 (地址也是二进制位 也有十六进制 他们可以相互转化)
指针类型(管理指针可以向后访问多少个字节)
char* 1个字节 int* 4个字节
访问几个字节 实则就是 (char int short 等的大小)

从上图中知道 a的地址是0x012FFE00 十六进制 同时后面的 0a 00 00 00 是存储的数据 10 十六进制 由此可以得出 int* 管理4个字节


指针类型 决定 他能访问多少字节 (一个字节8个比特位)
3,大端 小端

字节的高位还是低位怎么判断 10 的十六进制原码 反码 补码相同 用补码存储 00 00 00 0a 从左向右是 16^7 16^6...16^1 16^0 次方不断降低 那么位次也不端降低
 如何用代码去验证计算机是大端还是小端 
通过上图可知 既然整形 管理四个字节 而第一个字节是 0a 也就是10
那么只要访问它的第一个字节 看他是不是10 就可以验证 具体代码 如下
//int main()
//{
//	int a = 1;
//	char*p = (char*)&a;//int*
//	if (*p == 1)
//		printf("小端\n");
//	else
//		printf("大端\n");
//
//	return 0;
//} 
强制类型(char*)转换 也可以去掉 因为地址的大小是相同的 4/8个字节 取决于编译器
所以char* 可以存储int*
那么以上就是我介绍的内容 如有错误请指出 会尽快改正~
