目录
数据存储
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*
那么以上就是我介绍的内容 如有错误请指出 会尽快改正~