数据类型
基本的数据类型包括:
char | 字符数据类型 |
short | 短整型 |
int | 整型 |
long | 长整型 |
long long | 更长的长整型 |
float | 单精度浮点数 |
double | 双精度浮点数 |
类型的意义:
类型的基本归类
整型
(unsigned / signed) char
(unsigned / signed) int
(unsigned / signed) short [int]
(unsigned / signed) long [int]
字符在内存中存储的是字符的ASCII码值,是以整数形式存储,所以是整型。
浮点数类型
double
float
构造类型
数组类型
结构体类型 struct
枚举类型 enmu
联合类型 union
指针类型
(int /char / float / ...) *
空类型
viod表示空类型或无类型
整型在内存中的存储
计算机中整数有三种2进制表示方法,即原码,反码,补码。三种表示方法均有符号位和数值位两个部分,符号位0为正,1为负。正数的原码,反码,补码均相同,而负数均不同。
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统 一处理; 同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程 是相同的,不需要额外的硬件电路。
大小端
图中展示的是vs2022环境中数据在内存中存储情况,图中展示的是小端字节序存储。
而什么是小端大端呢?
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int check_sys()
{
int i = 1;
return (*(char*)&i);
}
int main()
{
int ret = check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
上面这段代码是检测当前机器是大端还是小端,1在内存中存储,如果是小端则会在内存中存01 00 00 00,相反在大端中会是00 00 00 01,在通过char强制取前一个字节则可得出结论。
浮点型在内存中的存储
举个例子
十进制的10.0,写成二进制是1010.0,就是(-1)^0*1.01*2^3,即S=0,M=1.01,E=3。
-10,写成二进制是-1010.0,就是(-1)^1*1.01*2^3,即S=1,M=1.01,E=3。
然后,指数E从内存中取出还可以再分成三种情况:
E不全为0或不全为1
下面这个代码可以尝试做一下。
int main()
{
int n = 9;
float* pFloat = (float*)&n;
printf("n的值为:%d\n", n);
printf("*pFloat的值为:%f\n", *pFloat);
*pFloat = 9.0;
printf("num的值为:%d\n", n);
printf("*pFloat的值为:%f\n", *pFloat);
return 0;
}
int main()
{
int n = 9;
float* pFloat = (float*)&n;
printf("n的值为:%d\n", n);
// 9
printf("*pFloat的值为:%f\n", *pFloat);
//00000000000000000000000000001001
//0 00000000 00000000000000000001001
//S=0 E=-127 M=1.00000000000000000001001
//E全为0,则为一个非常小的数,即输出0.000000
*pFloat = 9.0;
printf("num的值为:%d\n", n);
//(-1)^0*1.001*2^3
//S=0 E=3 M=1.001
//0 10000010 001000000000000000000000
//010000010001000000000000000000000
//1091567616
printf("*pFloat的值为:%f\n", *pFloat);
//9.000000
return 0;
}