:two_hearts::two_hearts::two_hearts:我们已经对C语言进行了一些学习与探讨,但==数据到底是如何在内存中存储==的我们是否知道,这里就应该画上一个大大的问号了???你真的知道吗?
一、数据类型的分类
==char== 字符型
==short== 短整型
==int== 整形
==long== 长整形
==long long== 更长的整形
==float== 单精度浮点数
==double== 双精度浮点数为什么数据会分这么多类型,为什么不只统计定义一个使用?C语言有没有字符串类型.
类型的意义:
1.使用不同的类型开辟的空间大小不同(使用范围)
2.在内存中存储方式不同.
1.1.类型的归类
整形:
char
unsigned char
signed char
short
unsigned short [int]
signed short [int]
int
unsigned int
signed int
long
unsigned long [int]
signed long [int]浮点数:
float
double构造类型:
数组类型
结构体 struct
枚举类型 enum
联合类型 union指针类型:
int *p
char *p
float *p
void *p
二、整形的存储
int a=10;
int b=-20;
我们仅仅知道整形在内存中分配四个空间,那么它是怎么在内存中怎么分配存储的尼?
2.1.原反补码
对于一个数,计算机要使用一定的编码方式进行存储。 原码,反码,补码是机器存储一个具体数字的编码方式
原码:数值直接翻译成二进制
反码:符号位不变,其他位按位取反
补码:反码+1
为什么数据在内存中不直接存储原码,还要大动干戈转化为补码在进行存储?我们看下官方的答案:
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;
同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程
是相同的,不需要额外的硬件电路。
我们可以看到a,b分别以补码的形式在内存中存储
2.2.大小端的介绍
那什么是大小端存储尼?
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址
中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地
址中。:sunglasses: :sunglasses: :sunglasses:根据上面的分析,那么我们的整形在内存中是以大端的方式存储还是小端的方式存储尼?
我们以b=-20为例进行分析
可以分析到,我们数据的低位存在内存的低地址中,符合小端存储方式,那么我们整数大部分都是以小端的方式在内存中存储
2.3.如何用代码判断大小端存储
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int check_s() {
int n = 1;
return *(char*)&n;
}
int main() {
int r = check_s();
if (r == 1) {
printf("小端存储\n");
}
else
printf("大端存储\n");
return 0;
}
2.4.经典再现
//输出什么?
#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; }
:grey_question::grey_question::grey_question: 不会有人天真的以为这个会输出三个-1吧,结果如下:
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0; }
:grey_question::grey_question::grey_question: 不会又有人天真的以为这个会输出三个-128吧,结果如下:
输出时为无符号输出,默认这个数是整数,而不是负数,所以才会输出一个很大的正数
:sunny::sunny::sunny:这一期的==数据在内存中如何存储==就到这里了,如果大家感到有帮助的话,记得一键三连哦.