您现在的位置是:首页 >学无止境 >数据在内存中的存储网站首页学无止境
数据在内存中的存储
目录
一.数据类型的详细介绍
我们都知道内置的数据类型有:
不知道大家是否好奇它们本身类型的意义是什么呢???
我将从下面2个方面来讲解:
1.使用这个类型开辟内存空间的大小(大小决定了使用范围)
2.如何看待内存空间的视角
- 类型的基本归类
- 整型家族:
- 浮点数家族:
- 构造类型:
而数组类型:除去变量名就是数组类型
比如:
int arr[10] 类型:int [10]
int arr[5] 类型:int [5]
char arr[10] 类型:char [10]
这三个就是不同的类型
- 指针类型:
- 空类型:
我们知道创建变量是需要向内存开辟空间的。空间的大小是根据类型的不同而不同
比如,我们创建了int 类型的a和b,我们都知道int类型要分配4个字节的空间,那在计算机中是如何存储的呢??我们往下看!!
在这之前我们需要了解一些原码 反码 补码的一点知识
而补码就是在反码上+1
我们为什么要讲这个呢???因为数据存放内存中其实存放的就是补码!!
自然我们也会有疑惑,为什么呢??
我们通过调试窗口看a和b变量在内存中的存储
这时,我们就看见了在内存中a和b变量在内存中的存储是以补码的形式,但我们也有新的疑惑,是不是顺序有点问题呢???
二.大小端字节介绍及判断
这时,我们要讲到大小端,那什么是大小端呢??
大端:是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中
小端:是指数据的高位保存在内存的高地址中,而数据的低位,保存在内存的低地址中
为什么要有大端和小端呢??
我们来验证一下在VS中是小端存储还是大端存储呢??
int cheak_sys()
{
int i = 1;
return (*(char*)&i);
}
int main()
{
int ret = cheak_sys();
if (ret == 1)
{
printf("小端
");
}
else
{
printf("大端
");
}
return 0;
}
通过验证我们发现在VS中,是以小端的形式存储的,这时我们也就能理解a和b顺序为什么是倒着存储的了
- 我们来练习一下:
-
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; }
结果是多少呢???
-
为什么呢???
所以unsigned char a结果就是255
我们来看下列代码:
int main() { char a = -128; //10000000 00000000 00000000 10000000 -原码 //11111111 11111111 11111111 01111111 -反码 //11111111 11111111 11111111 10000000 -补码 //发生截断 10000000 //整型提升后 11111111 11111111 11111111 10000000 printf("%u ", a); return 0; }
我们可以通过计算机来看一下
我们来看最后一道例题:
unsigned char i = 0;//0~255 int main() { for (i = 0; i <= 255; i++) { printf("Hello World ");//死循环打印 因为unsigned char 范围为0~255 当i为255时,i++后会变成0 形成一个循环 所以for循环条件恒成立 } return 0; }
为什么会循环打印呢???我们知道unsigned char i
的范围为0~255 又因为是无符号数,当i超过255时,会变成0
所以满足for循环条件,一直打印
最后:希望通过这篇文章让你对无符号整数有更好的理解,我也会不定时更新,分享我的学习经历