>数据类型详细介绍
>整型在内存中的存储:原码、反码、补码
>大小端字节序介绍及判断
>浮点型在内存中的存储解析
一、数据类型详细介绍
C语言类型:
1、内置类型:
char、short 、int、long、long long、float、double
整形家族:
(unsigned、signed)char/short/int/long
浮点型家族:
float、double
2、构造类型:
①数组类型 ②结构体 struct ③枚举类型 enum ④联合类型 union
3、指针类型
int *pi; char *pc; float *pf; void *pv
4、空类型
void 表示空类型(无类型)
通常应用于函数的返回类型、函数的参数、指针类型
类型的意义:
①使用这个类型开辟内存空间的大小(大小决定了使用范围);
②如何看待内存空间。
二、整型在内存中的存储
变量的创建是要在内存中开辟空间的,而空间的大小是根据不同的类型而决定的。
正数原码、反码、补码都相同;
eg:下面啷个变量在内存中是如何存储的
int a= 20; //0x00000014
int b=-10; //0xFFFFFFF6
对于整型来说:数据存储的是补码(原因:使用补码,可以将符号位和数值域统一处理;同时,加减法也可以统一处理(CPU只有加法器)此外,补码和原码相互转换,其运算过程是相同的,不需要额外的硬件电路)
原码:直接将二进制按照正负数的形式翻译成二进制;
反码:将原码的符号位不变,其他一次按位取反;
补码:反码加1.
我们会发现在内存中a、b存储分别是补码,但是顺序有点不对
>大小端
大端(存储)模式:是指数据的低位保存在内存的高地址中,而数据的高位保存在内存的低地址中
小端(存储)模式:是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中
也叫大小端字节存储模式
设计一个小程序来判断当前机器的字节序
#include<stdio.h>
//判断当前机器的字节序
check_sys()
{
int a = 1;
char* p = (char*)&a;
if (*p == 1)
return 1;
else
return 0;
}
int main()
{
int a = 1;
//返回1,小端
//返回0,大端
int ret=check_sys();
if (ret == 1)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
return 0;
}
代码优化:
check_sys()
{
int a = 1;
return *(char*)&a;
}
代码实现:
signed char范围:-128-127(0000 0000-0111 1111和1000 0000-1111 1111)
unsigned char范围:0-255
>浮点型在内存中的存储
float、double、long double
#include<stdio.h>
int main()
{
int n = 9;
float* pfloat = (float*)&n;
printf("%d\n",n);
printf("pfloat的值是%f\n", *pfloat);
*pfloat = 9.0;
printf("%d\n", n);
printf("pfloat的值是%f\n", *pfloat);
return 0;
}
分析:具体规则按照IEEE754
#include<stdio.h>
int main()
{
int n = 9;
float* pfloat = (float*)&n;
//00000000 00000000 00000000 00001001
printf("%d\n",n);
//(-1)^0*(0.0000000 00000000 00001001)*2^(-126)
//pfloat小数点后输出6bit,0.000000
printf("pfloat的值是%f\n", *pfloat);
*pfloat = 9.0;
//1001.0
//(-1)^0*1.001*2^3
//010000010001000000000000000000000
//转化为十进制为1091567616
printf("%d\n", n);
printf("pfloat的值是%f\n", *pfloat);
return 0;
}
代码执行: