数据的存储
1. 前言🚩
2. 整型在内存中的存储🚩
比如我们定义两个整型变量:
int a = 20;
int b = -10;
我们知道整型在内存中占四个字节的空间,在这之前我们先了解下面的概念
2.1 源码,反码,补码🏁
- 源码:直接将数值按照正负数的形式翻译成二进制就可以得到原码。
- 反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
- 补码:反码+1就得到补码。
我们说正整数的源码,反码,补码都相同.并且对于整形来说:数据存放内存中其实存放的是补码。
int main()
{
int num = 20;//创建一个整型变量,叫 num,这时num向内存申请4个字节来存放数据
//4个字节-32比特位
//00000000000000000000000000010100-原码
//00000000000000000000000000010100-反码
//00000000000000000000000000010100-补码
//正整数源反补相同
int num2 = -10;//
//10000000000000000000000000001010 - 原码
//11111111111111111111111111110101 - 反码
//11111111111111111111111111110110 - 补码
//
return 0;
}
假设我们要将这两个数相加,我们试试用反码,和补码相加,哪个是正确的:
源码相加:
//0000000000000000000000010100 num
//1000000000000000000000001010 num2
//1000000000000000000000011110 30的源码
补码相加:
//000000000000000000000010100 num
//111111111111111111111110110 num2
//011111111111111111111110110 补码
//000000000000000000000001010 10的源码
我们有看见用补码做加减法是刚好符合逻辑的.
我们再来看看 -10 在 vs2022 编译器上的内存存储:
3. 大端和小端🚩
我们之前观察了补码在内存中的存储,我们发现有一点奇怪,为什么数据是倒着放的?这里我们用变量a来阐述这个问题
int a = 0x11223344;
- 大端字节序(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
- 小端字节序(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
字节序—就是以字节为单位,讨论存储顺序的.这里的 11 为一个字节, 22 为一个字节,整型共四个字节
3.1 为什么有大端小端?🏁
3.2 怎样判断大小端🏁
怎么写一个代码判断当前机器是大端还是小端? 这里我们定义一个整型变量a的值为1
它在大小端机器上应该是这样存储的:
#include<stdio.h>
int main()
{
int a = 1;
char* p = (char*)&a;//强制类型转换,否则会报警告
if (*p == 1)
{
printf("当前机器为小端");
}
else
{
printf("当前机器为大端");
}
return 0;
}
4. 类型的范围🚩
我们把整型家族划分为:
下面我们主要来讨论 char 类型的范围,并做一些练习
4.1 char 类型的范围🏁
再来看看无符号位的存储:
- 有符号位char的范围: -128~127
- 无符号位char的范围: 0~255
5. 练习🚩
5.1 练习一🏁
1.
//输出什么?
#include <stdio.h>
int main()
{
char a= -1;
signed char b=-1;
unsigned char c=-1;
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
5.2 练习二🏁
2.
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
5.3 练习三🏁
3.
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u\n",i);
}
这里给大家看一看现象:
死循环
5.4 练习四🏁
4.
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
5.5 练习五🏁
5.
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\n");
}
return 0;
}